提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、子线程的概念
子进程为由另外一个进程(对应称之为父进程)所创建的进程。子进程的代码初始为父进程的copy,但不会无限copy。
~在linux下除了0号进程,其他都算是子进程。
二、子进程的创建
1.创建函数
代码如下:
#include <unistd.h>
pid_t fork(void);
创建新的进程,失败时返回EOF
成功时父进程返回子进程的进程号,子进程返回0
通过fork的返回值区分父进程和子进程
2.父子进程的特性
a.子进程继承了父进程的内容
b.父子进程有独立的地址空间,互不影响
c.若父进程先结束子进程成为孤儿进程,被init进程收养子进程变成后台进程
d.若子进程先结束父进程如果没有及时回收,子进程变成僵尸进程
3.进程的结束
#include <stdio.h>
#include <stdlib.h>
int main(void) {
printf(“this process will exit”);
exit(0);
printf(“displayed”);
}
注意:exit结束进程时会刷新流的缓冲区
main函数结束时会隐式地调用exit函数,所以有时在main段里不需要特意加上exit函数
exit()和return()的区别在于前者使当前函数退出,后者使整个程序退出
三、子进程的回收
#include <unistd.h>
pid_t wait(int *status);
成功时返回回收的子进程的进程号;失败时返回EOF
若子进程没有结束,父进程一直阻塞
若有多个子进程,哪个先结束就先回收
status 指定保存子进程返回值和结束方式的地址,需要时调用
status为NULL表示直接释放子进程PCB,不接收返回值
#include <unistd.h>
pid_t waitpid(pid_t pid, int *status, int option);
/*
pid>0时,只等待固定进程ID的结束,否则一直等待。
pid=-1时,等待任何一个子进程退出,没有任何限制,此时waitpid和wait的作用一样。
pid=0时,等待同一个进程组中的任何子进程,如果子进程已经加入了别的进程组,waitpid不会对它做任何理睬。
pid<-1时,等待一个进程组中指定的子进程为pid的绝对值。
option
可以为0。
WNOHANG :若由pid指定的子进程未发生状态改变(没有结束),则waitpid()不阻塞,立即返回0。
WUNTRACED: 返回终止子进程信息和因信号停止的子进程信息。
wait(wait_stat) 等价于waitpid(-1,wait_stat,0)
*/