2.2 linux C 进程与多线程入门--(2)等待进程

问题:在创建进程那一节,我们看到,消息的输出是父子进程交替输出,且父进程在子进程之前结束。如果要安排父进程在子进程结束之后,可以调用wait函数。

函数说明:

 pid_wait (int stat_loc)

包含的头文件:#include<sys/types.h> #include<sys/wait.h>

返回值:子进程的pid 参数:如果stat_loc 不是一个空指针,状态信息将被写入他指向的位置

sys/wait.h文件中的状态信息如下表:

宏定义                                           说明

WIFEXITED(stat_val)                 如果进程正常结束,他就取一个非零值

WEXITSTATUS(stat_val)            如果wifexited非零,它返回子进程的推出码

WIFSIGNALED(stat_val)           如果子进程因为一个未捕获的信号而终止,他就去一个非零值

WTERMSIG(stat_val)                如果wifsignaled非零,它返回一个信号代码

WIFSTOPPED(stat_val)           如果子进程终止,他就取一个非零值

WSTOPSIG(stat_val)                如果WIFSTOPPED 非零,它返回一个信号代码

wait系统调用会使父进程暂停执行,直到它的一个子进程结束为止。

  1. #include <sys/types.h>  

  2. #include <sys/wait.h>  

  3. #include <unistd.h>  

  4. #include <stdio.h>  

  5.   

  6. int main(){  

  7.     pid_t pid;  

  8.     char * message;  

  9.     int n;  

  10.     int exit_code;  

  11.           

  12.     printf("fork program starting ");  

  13.     pid = fork();  

  14.     switch(pid){  

  15.         case -1:  

  16.             perror("fork failed");  

  17.             exit(1);  

  18.         case 0:  

  19.             message ="This is the child";  

  20.             n = 5;  

  21.             /*子进程的退出码*/  

  22.             exit_code = 37;  

  23.             break;  

  24.         default:  

  25.             message = "This is the parent";  

  26.             n = 3;  

  27.             /*父进程的退出码*/  

  28.             exit_code = 0;  

  29.             break;  

  30.         }  

  31.   

  32.         /*pid非0,在父进程执行*/  

  33.         if(pid){  

  34.             int stat_val;  

  35.             pid_t child_pid;  

  36.   

  37.             /*父进程直到子进程推出后执行*/  

  38.             child_pid = wait(&stat_val);              

  39.             printf("Child process has finished: PID=%d ",child_pid);  

  40.             if(WIFEXITED(stat_val))  

  41.                 /*子进程正常结束,输出子进程退出码,即exit_code=37*/  

  42.                 printf("Child exited with code %d ", WEXITSTATUS(stat_val));  

  43.             else  

  44.                 /*子进程非正常结束*/  

  45.                 printf("Child terminated abnormally ");  

  46.         }  

  47.   

  48.         for(; n > 0; n--){  

  49.                 puts(message);  

  50.                 sleep(1);  

  51.                 }  

  52.         exit(exit_code);  

  53.               

  54.       

  55. }  

父进程通过wait系统调用把自己的执行挂起,直到子进程的状态信息出现为止。这将发生在子进程调用exit()的时候,我们把它的退出码设为37.

然后,父进程继续执行,通过测试wait调用的返回值确定子进程已经正常结束,并从状态信息里提取出自进程的退出码。

原文地址:https://www.cnblogs.com/yjds/p/8598869.html