Linux多进程基础之进程基础用法

创建进程:

pid_t fork(void);

功能:创建一个子进程

返回值:

​ 成功:在父进程中返回子进程的PID

​ 在子进程中返回的是0

​ 失败:-1

#include <unistd.h>

void main()
{
	fork();
	
	printf("program is end\n");
}

运行结果:
在这里插入图片描述

为什么运行了两次哪?原因:
在这里插入图片描述

注意:子进程从fork()函数的下一行开始运行。

验证返回值:

扫描二维码关注公众号,回复: 5409340 查看本文章
#include <unistd.h>

void main()
{
	pid_t pid;
	pid = fork();
	
	printf("pid is %d\n",pid);
}

运行结果:
在这里插入图片描述

问题:如何让父进程和子进程做不同的事?

#include <unistd.h>

void main()
{
	pid_t pid;
	pid = fork();
	
	if(pid > 0)
	{
		//父进程 操作1
		
		printf("This is father process\n");
		
		exit(0);
	}
	else
	{
		//子进程 操作2
		
		printf("This is child process\n");
		
		exit(0);

	}
	
}

运行结果:
在这里插入图片描述

创建进程另外一种方法:

pid_t vfork(void);

功能:创建一个子进程,并阻塞父进程

返回值:同fork()函数

#include <unistd.h>
#include <sys/types.h>

void main()
{
	pid_t pid;
	pid = vfork();
	
	if(pid > 0)
	{
		//父进程 操作1
		
		printf("This is father process\n");
		
		exit(0);
	}
	else
	{
		//子进程 操作2
		
		printf("This is child process\n");
		
		exit(0);

	}
	
}

运行结果:
在这里插入图片描述

可以明显看到顺序不同

那么在fork()完了以后是父进程先运行还是子进程先运行啊?

如果是fork(),运行顺序不一定;如果是vfork(),肯定是子进程先运行。

fork()和vfork()的区别:

①.父进程和子进程 运行的顺序

②.用fork()创建的子进程有自己独立的数据段/堆栈;

而vfork()创建的子进程没有自己独立的数据段/堆栈,与父进程共享。

#include <unistd.h>
#include <sys/types.h>

void main()
{
	pid_t pid;
	
	int count = 0;
	
	pid = fork(); 
	
	count++;
	
	printf("count is %d\n",count);
	
	exit(0);	
	
}

运行结果:
在这里插入图片描述

为什么会这样哪?
在这里插入图片描述

#include <unistd.h>
#include <sys/types.h>

void main()
{
	pid_t pid;
	
	int count = 0;
	
	pid = vfork(); 
	
	count++;
	
	printf("count is %d\n",count);
	
	exit(0);	
	
}

在这里插入图片描述

进程退出:

exit(0); //退出状态:1为异常退出,0为正常
在这里插入图片描述

进程等待:

pid_t wait(int * status);

功能:挂起调用它的进程,直到其子进程结束

返回值:

​ 成功:返回终止的那个子进程的ID

​ 失败:-1

参数:

status:记录子进程的退出状态

实践:

#include <unistd.h>
#include <sys/types.h>

void main()
{
	pid_t pid;
	pid = fork();
	
	if(pid > 0)
	{
		//父进程 操作1
		
		printf("This is father process\n");
		
		exit(0);
	}
	else
	{
		//子进程 操作2
		
		printf("This is child process\n");
		
		exit(0);

	}
	
}

运行结果:
在这里插入图片描述

首先运行父进程,在运行子进程;

#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

void main()
{
	pid_t pid;
	pid = fork();
	
	if(pid > 0)
	{
		//父进程 操作1
		
		wait(NULL); //等待
		
		printf("This is father process\n");
		
		exit(0);
	}
	else
	{
		//子进程 操作2
		
		printf("This is child process\n");
		
		exit(0);

	}
	
}

运行结果:
在这里插入图片描述

调用了wait()后可以看到顺序的改变,挂起父进程,直到子进程结束在执行父进程。

程序执行:

int execl(const char * pathname, const char * )

功能:运行可执行文件

返回值:

​ 成功:不返回

​ 失败:才返回

参数:

pathname:要运行的可执行文件的路径

arg:可执行文件运行需要的参数

#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

void main()
{
	pid_t pid;
	pid = fork();
	
	if(pid > 0)
	{
		//父进程 操作1
		wait(NULL);
		
		printf("This is father process\n");
		
		exit(0);
	}
	else
	{
		//子进程 操作2
		
		execl("/bin/ls","ls","/home",NULL);
		
		printf("This is child process\n");
		
		exit(0);

	}
	
}

运行结果:
在这里插入图片描述

问题:

为什么printf(“This is child process\n”);没有执行?
在这里插入图片描述

解释:调用execl()后代码段会进行全部覆盖。
在这里插入图片描述

exec对比fork

fork创建一个新的进程,产生一个新的PID;

exec保留原有的进程,执行新的代码。

猜你喜欢

转载自blog.csdn.net/QQ1402369668/article/details/86687610