目录
- 子进程与父进程
- fork()函数
- 多进程服务器
子进程与父进程
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。子进程指的是由另一进程(对应称之为父进程)所创建的进程
子进程通常通过父进程调用fork()函数产生,调用fork()后,操作系统会复制一个与父进程几乎完全相同的子进程,这两个进程共享代码空间(即文本段),但是数据空间是互相独立的
fork()函数
函数原型及所需的头文件如下
#include <unistd.h>
pid_t fork(void);
fork意为分叉,fork()函数用来创建一个子进程,并返回pid_t类型的进程ID
fork()函数调用时不需要参数,但是会返回两个返回值分别返回给父进程和子进程,父进程返回子进程的进程ID,子进程返回0,fork()函数执行后可以通过判断返回值判断父子进程,每个进程也可以通过调用getpid()函数获得自己的进程号,也可以通过getppid()获得自己父进程的进程号
值得注意的是,子进程拥有父进程当前运行到的位置(两进程的程序计数器PC值相同,即子进程是从fork返回处开始执行的),不过fork()创建进程之后子进程与父进程谁先开始运行是完全随机的,可以通过进程间通信(IPC)解决父子进程的同步问题
创建子进程后,父进程需要等待子进程的退出并为其善后:
如果父进程在子进程退出之前退出了,这时候子进程就变成了孤儿进程。当然每一个进程都应该有一个独一无_的父进程,init进程就是这样的-个“慈父”,Linux内核中所有的子进程在变成孤儿进程之后都会被init进程"领养”,这也意味着孤儿进程的父进程最终会变成init进程;如果一个已经终止但其父进程尚未对其进行善后处理(获取终止子进程的有关信息如CPU时间片、释放它锁占用的资源如文件描述符等)的进程被称僵死进程(zombie),ps命令将僵死进程的状态打印为Z
。那么父进程如何为子进程善后呢?
父进程通常通过调用wait()函数为子进程善后
wait()与waitpid()
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);
当一个进程正常或异常退出时,内核就会向其父进程发送SIGCHLD信号。因为子进程退出是一个异步事件