栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Linux系统编程之进程(个人理解总结)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Linux系统编程之进程(个人理解总结)

本文中的章节都是以疑问句的形式记录,也是希望大家带着问题来学习、总结进程相关知识。说不定会在以后的面试中会被问到。

文章目录
  • 一、什么是程序,进程?(面试)
  • 二、什么是进程标识符?(面试)
  • 三、如何查看系统中有哪些进程?
  • 四、c程序的存储空间是如何分配的?(面试)
  • 五、创建子进程
    • 1.fork()
    • 2.fork()创建的子进程数据情况
    • 3.vfork()创建子进程的数据情况
    • 4.fork()创建子进程的目的?
  • 六、几种特殊进程
  • 七、exec*族函数
  • 八、system函数
  • 九、poen函数


一、什么是程序,进程?(面试)

程序:就是一些指令和数据的集合是一个静态的概念。
进程:简单来说就是运行中的程序,是一个动态的概念。


二、什么是进程标识符?(面试)

每个进程都有自己唯一的非负整数来表示进程称为进程标识符。

三、如何查看系统中有哪些进程?

1.ps -aux
2.top

四、c程序的存储空间是如何分配的?(面试)

五、创建子进程 1.fork()
#include
#include 
#include 
#include
int main()
{
	pid_t pid;
	int data=0;
	
	pid=fork();
	while(1){
	if(pid==0){
		printf("this is child process!my pid=%dn",getpid());
	}
	else if(pid>0){
		printf("this is parent proscess!my pid=%dn",getpid());
		}
	}
	return 0;
}
2.fork()创建的子进程数据情况

由fork()创建的子进程,是父进程的副本。子进程拥有父进程的数据空间,堆,栈的一份拷贝,但父子进程不共享这部分空间。

#include
#include 
#include 
#include
int main()
{
	pid_t pid;
	int data=0;
	
	pid=fork();
	printf("before fork data = %dn",data);
	if(pid==0){
		printf("this is child process!my pid=%dn",getpid());
		printf("data in child process = %dn",data);
	}
	else if(pid>0){
		printf("this is parent proscess!my pid=%dn",getpid());
		data++;
		printf("data in parent process = %dn",data);	
	}
	return 0;
}
3.vfork()创建子进程的数据情况

vfork创建的父子进程,共享数据空间,且父进程等待子进程运行完,所以子进程结束需要调用exit()函数不然父进程不知道子进程退出与否,还一直等。

#include
#include 
#include 
#include
int main()
{
	pid_t pid;
	int data=0;
	
	pid=vfork();
	printf("before fork data = %dn",data);
	if(pid==0){
		printf("data in child process = %dn",data);
		data++;
		printf("this is child process!my pid=%dn",getpid());
		sleep(1);
		exit(1);
	}
	else if(pid>0){
		sleep(1);
		printf("this is parent proscess!my pid=%dn",getpid());
		printf("data in parent process = %dn",data);	
	}
	return 0;
}
4.fork()创建子进程的目的?

1.通常在网络服务进程经常会使用到,父进程等待客户端的请求,当请求到达时,使用fork()与客户端进行对接。当再来一个对接信号时,再fork()
2.一个进程需要执行不同的程序时,使用fork()通常与exec*族函数配合使用

六、几种特殊进程

1.进程0:也叫做交换进程(swapper)(内核态进程)
2.进程1:也叫做init进程(用户态进程)
3.僵尸进程:父进程不关心子进程的运行情况,wait(NULL)(有危害–容易导致崩溃)
4.孤儿进程:父进程先于子进程退出,被init进程收养。(无危害)

七、exec*族函数

execl(“文件路径”,“可执行文件名”,参数,NULL)

#include 
#include 
#include 

#include 
#include 
#include 
#include 
#include 
#include 
#include 


int main()
{
	pid_t pid;
	int data = 10;

	while(1){

		printf("please input a datan");
		scanf("%d",&data);	
		if(data == 1){
				int fdSrc;			
			
				pid = fork();
				if(pid > 0){
					wait(NULL);
				}
					
				if(pid == 0){
					
					execl("./changData","changData","config.txt",NULL);
				}

		}
		else{
			printf("wait ,do nothingn");
		}
	}

	return 0;
}

八、system函数
#include 
#include 
#include 

#include 
#include 
#include 
#include 
#include 
#include 
#include 


int main()
{
	pid_t pid;
	int data = 10;

	while(1){

		printf("please input a datan");
		scanf("%d",&data);	
		if(data == 1){
				int fdSrc;			
			
				pid = fork();
				if(pid > 0){
					wait(NULL);
				}
					
				if(pid == 0){
					
	//				execl("./changData","changData","config.txt",NULL);
					system("./changData config.txt");
				}

		}
		else{
			printf("wait ,do nothingn");
		}
	}

	return 0;
}

九、poen函数

poen比system在应用中的好处:

可以获取运行的输出结果

#include 
#include 
#include 
//int execl(const char *path, const char *arg, ...);
//size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
int main(void)
{
    char ret[1024] = {0};
    FILE *fp;

    fp = popen("ps","r");
    int nread = fread(ret,1,1024,fp);	

    printf("read ret %d byte, ret=%sn",nread,ret);
	    
    return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1024008.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号