天天看點

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 ;
}
           

繼續閱讀