1. wait、waitpid 函数简介

补充:对于waitpid,如果返回值为0,表示指定去等待的子进程尚未结束。

该系列宏的使用方法展示:

PART1
实验思路:
使用wait系统调用让父进程给子进程收尸,并获取子进程的返回值。
同时,正常终止。
直接打印获取的返回值会与实际返回的值不一样,进而引出检查WIFEXITED/WEXITSTATUS(status)等系列宏。
实验1: waitpid或waitpid,使用展示, 同时,直接使用printf打印出子进程的返回值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/wait.h> int main( void ) {
int status = 0; pid_t pid; printf ( "pid: %ld\n" , ( long )getpid()); pid = fork(); if (pid < 0) {
printf ( "fork error" ); } else if (pid == 0) { sleep(2); printf ( "pid: %ld, ppid: %ld\n" , ( long )getpid(), ( long )getppid()); exit (3); } if (waitpid(pid, &status, 0) != pid) { // if (wait(&status) != pid) { 这里也可以使用wait, 我这里对waitpid的使用也是阻塞方式的 printf ( "waitpid error" ); } else {
printf ( "status =%d\n" , status); } return 0; } |
编译运行:

可以看到,本实验中的waitpid在2秒后才返回,成功替子进程收尸。
但是我们打印的status不对劲,我们的代码内子