[Linux-进程控制] 进程创建&进程终止&进程等待&进程程序替换&简易shell
进程创建
fork函数回顾
之前在进程概念一章中提到了fork函数,fork功能和fork分流操作,本章中我们会进行细分和深入学习
操作系统为每个进程使用唯一的 id 来跟踪所有进程。为此,fork()
不接受任何参数并返回一个 int 值,如下所示:
#include <unistd.h>
pid_t fork(void);
- 零:如果是子进程(创建的进程)。
- 正值:如果是父进程。
- 负值:如果发生错误。
双返回值
为什么要给子进程返回0,给父进程返回子进程的pid
一个父进程可以创建多个子进程,而一个子进程只能有一个父进程。因此,对于子进程来说,父进程是不需要被标识的
而对于父进程来说,子进程是需要被标识的,因为父进程创建子进程的目的是让其执行任务的,父进程只有知道了子进程的PID才能很好的对该子进程指派任务。
如何理解fork会有两个返回值
首先要知道fork是一个函数
父进程调用fork函数后,为了创建子进程,fork函数内部将会进行一系列操作,包括创建子进程的进程控制块、创建子进程的进程地址空间、创建子进程对应的页表等等。子进程创建完毕后,操作系统还需要将子进程的进程控制块添加到系统进程列表当中,此时子进程便创建完毕了。
//一个子进程
pid_t fork()
{
//拷贝自父进程,形成子进程对应的数据结构
task_struct;
mm_struct;
页表;
文件;
其他信息;
//OS也要管理子进程,描述+组织
task_struct 链接进入系统进程列表中
add task_struct into CPU runqueue
//走到这里,进程创建完了
return pid;
}
也就是说,在fork函数内部执行return语句之前,子进程就已经创建完毕了,那么之后的return语句不仅父进程需要执行,子进程也同样需要执行,这就是fork函数有两个返回值的原因。
调用fork之后
进程调用fork,当控制转移到内核中的fork代码后,内核做:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)