调用 vfork 创建子进程
| 1 | pid_t pid = vfork(); | 
vfork 用于创建一个新进程,和 fork 不同, vfork 不将父进程的地址空间完全复制到子进程中,不会复制页表
vfork 执行一次会返回两个返回值
- 在子进程中返回0
- 在父进程中返回子进程 pid_t
 执行失败返回 -1
调用 waitpid 等待子进程结束
| 1 | waitpid(pid, &status, 0); | 
waitpid() 会暂时停止目前程序的执行,知道有信号来到或子进程结束
其中 pid 为子进程 pid, status 为要返回的子进程的结束状态
有如下几个宏可以用来判别结束情况
- WIFEXITED(status)如果子进程正常结束则为非 0 值。
- WEXITSTATUS(status)取得子进程 exit()返回的结束代码,一般会先用 WIFEXITED 来判断是否正常结束才能使用此宏。
- WIFSIGNALED(status)如果子进程是因为信号而结束则此宏值为真
- WTERMSIG(status) 取得子进程因信号而中止的信号代码,一般会先用 WIFSIGNALED 来判断后才使用此宏。
- WIFSTOPPED(status)如果子进程处于暂停执行情况则此宏值为真。一般只有使用 WUNTRACED 时才会有此情况。
- WSTOPSIG(status)取得引发子进程暂停的信号代码,一般会先用 WIFSTOPPED 来判断后才使用此宏。
- 如果执行成功则返回子进程识别码(PID) ,如果有错误发生则返回返回值-1。失败原因存于 errno 中。