zoukankan      html  css  js  c++  java
  • wait waitpid

    定义

    pid_t wait(int *status);
    pid_t waitpid(pid_t pid, int *status, int options);

    暂时停止进程的执行,直到有信号来到或子进程结束
    如果不在意结束状态值,则参数status 可以设成NULL

    pid = wait(NULL); 

    wait实现

    # vi unistd.h
    static inline pid_t wait(int * wait_stat)
    {
        return waitpid(-1,wait_stat,0);
    } 

    status
    由于这些信息被存放在一个整数的不同二进制位中,所以用常规的方法读取会非常麻烦,人们就设计了一套专门的宏(macro)来完成这项工作

    1. WIFEXITED(status)
      子进程正常退出(”exit”或”_exit”),此宏返回非0
    2. WEXITSTATUS(status)
      获得子进程exit()返回的结束代码,一般先要用WIFEXITED判断是否正常结束。如果进程不是正常退出的,也就是说,WIFEXITED返回0,这个值就毫无意义
    3. WIFSIGNALED(status)
      若为异常结束子进程返回的状态,则为真;对于这种情况可执行WTERMSIG(status),取使子进程结束的信号编号
    4. WTERMSIG(status) 取得子进程因信号而中止的信号代码,一般会先用 WIFSIGNALED 来判断后才使用此宏
    5. WIFSTOPPED(status) 若为当前暂停子进程返回的状态,则为真;对于这种情况可执行WSTOPSIG(status),取使子进程暂停的信号编号
    6. WSTOPSIG(status) 取得引发子进程暂停的信号代码,一般会先用 WIFSTOPPED 来判断后才使用此宏

    waitpid

    1. pid<-1 等待进程组识别码为 pid 绝对值的任何子进程
    2. pid=-1 等待任何子进程,相当于 wait()
    3. pid=0 等待进程组识别码与目前进程相同的任何子进程
    4. pid>0 等待任何子进程识别码为 pid 的子进程

    options

    1. WNOHANG 若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。若结束,则返回该子进程的ID
    2. WUNTRACED 若子进程进入暂停状态,则马上返回,但子进程的结束状态不予以理会。WIFSTOPPED(status)宏确定返回值是否对应与一个暂停子进程

    举例

    void sig_func(int sig)
    {
        pid_t pid = 0;
        int status = 0;
    
        pid = wait(&status);
        if (WIFEXITED(status))                                                                    
        {
            printf("the return code is %d.
    ", WEXITSTATUS(status));
        }
        else
        {
            printf("the child process %d exit abnormally.
    ", pid);
        }
    }
    
    int main()
    {
        signal(SIGCHLD, sig_func);
    
        if(fork() == 0)
        {
            printf("This is child process with pid of %d.
    ", getpid());
            exit(EXIT_SUCCESS);
        }
    
        while(1);
    
        return 0;
    }
  • 相关阅读:
    【洛谷】1852:[国家集训队]跳跳棋【LCA】【倍增?】
    【POJ】1835:宇航员【模拟】【三维行走】
    【BZOJ】3195: [Jxoi2012]奇怪的道路【状压/奇偶性】【思路】
    【10.24校内测试】【欧拉路径(有向+无向)】【双向链表/树状数组/线段树】
    【POJ】1840:Eqs【哈希表】
    【洛谷】4317:花神的数论题【数位DP】
    【POJ】1486:Sorting Slides【二分图关键边判定】
    算法模板
    Redis源码阅读一:简单动态字符串SDS
    总结下c/c++的一些调试经验
  • 原文地址:https://www.cnblogs.com/zhangxuechao/p/11709926.html
Copyright © 2011-2022 走看看