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;
    }
  • 相关阅读:
    swift -- 静态变量static
    swift -- 单例+ lazy懒加载 + 第三方库
    swift -- 代理delegate
    swift -- 闭包
    swift -- 构造/析构函数
    swift -- 继承
    swift -- as / 扩展
    swift -- 类中的方法
    swift -- 类和结构体
    C 扩展库
  • 原文地址:https://www.cnblogs.com/zhangxuechao/p/11709926.html
Copyright © 2011-2022 走看看