进程控制:创建进程、进程终止、进程等待。
-
创建进程:
创建进程:fork()函数,这个接口是以父进程为模板复制创建一个子进程,父子进程代码共享,但数据独有,而创建新的进程往往是希望它去完成不同的功能,函数的返回值可以起到分流的作用(父进程返回子进程的pid,而子进程的返回值为0),来判断父、子进程。而父子进程的优先级,取决于CPU调度。与fork()功能类似的还有vfork(),但是fork()有写时拷贝技术,所以现在已经不再使用。
那什么是写时拷贝技术?——如前所说,创建一个新的进程往往是为了让它完成不同的任务。所以如果父进程占用的内存的空间很大,若是子进程再拷贝一份的话,1.需要耗费时间 2.若是子进程只完成读的功能,就更用不着进行一次拷贝代码了。所以fork()产生子进程之后,子进程并没有把父进程的代码拷贝一份,而是共享一块区域。但是,linux下将这块区域设置为了只读的,当父子进程需要改变其数据时,会发出一个缺页中断,然后由操作系统将所修改的数据所在的页复制一份,
-
进程终止:
正常退出:从main函数中返回,调用exit,_exit 异常退出:ctrl+c,信号终止
-
进程等待:
一个进程退出后因为要保存自己退出的原因,因此不会释放所有的资源,它等着父进程查看他的退出原因,然后才释放所有资源。若父进程没有关注其退出,此进程就变成了僵尸进程,而僵尸进程的危害会造成资源泄露,十分危险,所以父进程应该关注一下子进程的退出原因(进程等待的重要性)。进程等待就是等待子进程的状态改变,获取子进程的退出状态码,当允许系统释放子进程的所有资源,这时候子进程才会被完全释放掉。所以进程等待就是避免产生僵尸进程的主要方式。
进程等待有两种方式:wait(阻塞等待)和waitpid(非阻塞等待)。
wait和waitpid的区别:wait一只检测某个变量,条件不满足也一直等待。而waitpid则不是一直等待,它是隔一段时间去检测某个条件是否满足,若不满足,他就会去做别的事情。
1.pid_t wait(int* status) status用于获取子进程状态码 , wait函数目的就是为了等待任意一个子进程的退出,因为wait是一个阻塞型函数,因此若没有子进程退出,那么他就一直等待,直到有子进程退出,其返回值是返回退出的子进程pid。
2.pid_t waitpid(pid_t pid, int* status, int options) 当pid为-1时,等待任意进程,>0时等待指定的子进程,status获取退出状态码,options可以选择是否为阻塞等待,值为0时,为阻塞等待,为WNOHANG时,为非阻塞等待。返回值-1时,出错;为0时,没有子进程退出;>0时,为退出子进程pid。