wait取得サブプロセス終了状態WIFEXITEDとWIFSIGNALEDの使い方

14113 ワード

wait関数を使用してパラメータstatusを出力し、プロセスの終了状態を保存できます.
一般的なマクロ関数は、1、WIFEXITED(status)が0でない場合、プロセスが正常に終了することを示すグループに分けられます.上マクロが真の場合、WEXITSTATUS(status)でプロセス終了状態(exit時パラメータ)の例を取得できます.
        if(WIFEXITED(status)){
            printf("     %d
"
, WEXITSTATUS(status))
; }

2、WIFSIGNALED(status)が0以外の場合、プロセス異常終了を示す.マクロが真である場合、プロセスを終了させる信号番号の使用例は、WTERMSIG(status)によって取得され得る.
    if(WIFSIGNALED(status)){
        printf("           : %d
"
,WTERMSIG(status))
; }

3、WIFSTOPED(status)が0でないことはプロセスが一時停止状態であることを示し、マクロが真である場合は、WSTOPSIG(status)によってプロセスを一時停止させる信号番号4、WIFCONTIONUED(status)が0でないことは一時停止後も運転を継続していることを示す.
WIFEXITEDとWIFSIGNALED用法完備プログラム:
#include 
#include 
#include 
#include 
#include 

int main(void)
{
    pid_t pid, wpid;
    int status;

    pid = fork();
    if(pid == 0){               //   
        printf("child --- my parent is %d
"
, getppid()); sleep(30); // 30 printf("child is die
"
); }else if(pid>0){ // wpid = wait(&status); // if(wpid == -1){ perror("wait error:"); exit(1); } // if(WIFEXITED(status)){ printf("child exit with %d
"
, WEXITSTATUS(status)); } // if(WIFSIGNALED(status)){ printf("child killed by %d
"
, WTERMSIG(status)); } while(1) { printf("parent pid = %d, sonpid = %d
"
, getpid(), pid); sleep(1); } } else { perror("for error"); exit(1); } return 0; }

テストプログラムコンパイラ:
yu@ubuntu:~/cplusplus/wait    $ gcc getstatus.c -o getstatus.out

1、まずWIFEXITEDの正常な退出状況をテストし、実行:
yu@ubuntu:~/cplusplus/wait    $ ./getstatus.out 
child --- my parent is 6408
child is die
child exit with 0
parent pid = 6408, sonpid = 6409
parent pid = 6408, sonpid = 6409
parent pid = 6408, sonpid = 6409
parent pid = 6408, sonpid = 6409
....

2、テストWIFSIGNALED信号が終了し、実行(sleep(300)テストしやすい):
yu@ubuntu:~/cplusplus/wait    $ ./getstatus.out 
child --- my parent is 6418

別の端末を開き、プロセスを表示し、killコマンドでサブプロセスを終了します.
yu@ubuntu:~/cplusplus/Process$ ps aux | grep getstatus.out
yu         6437  0.0  0.0   4224   784 pts/18   S+   21:58   0:00 ./getstatus.out
yu         6438  0.0  0.0   4356    84 pts/18   S+   21:58   0:00 ./getstatus.out
yu         6442  0.0  0.0  21292   976 pts/4    S+   21:58   0:00 grep --color=auto getstatus.out

yu@ubuntu:~/cplusplus/Process$ kill 6438

サブプロセスが異常に終了するoutプログラム出力情報:
yu@ubuntu:~/cplusplus/wait    $ ./getstatus.out 
child --- my parent is 6437
child killed by 15
parent pid = 6437, sonpid = 6438
parent pid = 6437, sonpid = 6438
parent pid = 6437, sonpid = 6438
parent pid = 6437, sonpid = 6438
...

以上のように、プロセス終了の信号番号を15とし、kill-lから15の信号がSIGTERMであることが分かる.
yu@ubuntu:~/cplusplus/wait    $ kill -l
 1) SIGHUP   2) SIGINT   3) SIGQUIT  4) SIGILL   5) SIGTRAP
 6) SIGABRT  7) SIGBUS   8) SIGFPE   9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG  24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF 28) SIGWINCH    29) SIGIO   30) SIGPWR
31) SIGSYS  34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX