天天看点

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(-,wait_stat,);
} 
           

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 = ;
    int status = ;

    pid = wait(&status);
    if (WIFEXITED(status))                                                                    
    {
        printf("the return code is %d.\n", WEXITSTATUS(status));
    }
    else
    {
        printf("the child process %d exit abnormally.\n", pid);
    }
}

int main()
{
    signal(SIGCHLD, sig_func);

    if(fork() == )
    {
        printf("This is child process with pid of %d.\n", getpid());
        exit(EXIT_SUCCESS);
    }

    while();

    return ;
}
           

继续阅读