zoukankan      html  css  js  c++  java
  • 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调用的返回值确定子进程已经正常结束,并从状态信息里提取出自进程的退出码。

  • 相关阅读:
    正则表达式30分钟入门教程
    解读C#中的正则表达式1
    web开发技巧经验积累
    常用效果的实现(Javascript的子父页访问、函数调用)
    document.execCommand()编程
    把任意文件隐藏在一张图片里
    在C#中如何实现Form与Form之间的通信
    全国各个省市数据库
    对长时间装载的ASP.NET页如何在客户端浏览器中显进度
    关于UPC E条码的校验
  • 原文地址:https://www.cnblogs.com/yjds/p/8598869.html
Copyright © 2011-2022 走看看