1、fork函数
创建一个子进程。pid_t fork(void) 失败返回-1,成功返回值:(1)父进程返回子进程的ID(非0);(2)子进程返回0。
pid_t类型表示进程ID,但为了表示-1,它是有符号整形。(0不是有效进程ID,int最小为1)
注意:fork返回值不是返回两个值,而是fork后,fork函数变为两个,父子进程各自返回一个。
2、多进程
一次fork函数调用可创建一个子进程,创建n个子进程可以用for循环,但需注意创建完子进程后退出,不然子进程会伴随循环继续创建子子进程。
3、获取进程pid函数
pid_t getpid(void);//获取当前进程pid
pid_t getppid(void);//获取当前进程的父进程pid
区分一个函数是系统函数还是库函数依据:(1)是否访问内核数据结构 (2)是否访问外部硬件资源 二者有任一,即是系统函数;二者都无,则是库函数
4、僵尸进程
进程终止,父进程尚未回收,子进程残留资源(PCB)存放于内核中,变成僵尸进程。特别注意:僵尸进程无法用kill命令清除掉,可用进程回收进行清除。
5、wait函数
进程回收。
一个进程在终止时会关闭所有文件描述符,释放在用户空间分配的内存,但是它的PCB还保留着,内核在其中保存了一些信息:如果是正常终止则保留退出状态;如果是异常终止则保留着导致该进程终止的信号是哪个。这个进程的父进程可以调用wait或waitpid获取这些信息,然后彻底清除掉这个进程。
例如,一个进程的退出状态可以在shell中用特殊变量$?查看,因为shell是它的父进程,当终止时shell调用wait或waitpid得到它的退出状态同时策底清除掉这个进程。
父进程调用wait函数可以回收子进程终止信息,该函数有三个功能:
- 阻塞等待子进程退出
- 回收子进程残留资源
- 获取子进程结束状态(退出原因)
6、作业
(1)创建子进程,调用fork后,在子进程调用自定义程序(段错误、浮点型错误),用waitpid回收,查看退出状态。
(2)验证子进程是否共享文件描述符,子进程负责写入数据,父进程负责读数据。