用wait取得exit status

這篇是延伸自fork的文章裡面提到的wait函式
那篇裡面只有簡單的使用wait避免產生zombie process
而今天這篇的重點是在exit status的取得
是一個還蠻實用的技巧
以下是一個簡單的小範例實驗

先來一個execlp正常運作版本
//status_test.cpp
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <iostream>

int main(){
        std::cout<< "in main" << std::endl;
        int status;
        if(fork()==0){ /*child process*/
                std::cout<< "in child process, pid=" << getpid() << std::endl;
                if(execlp("ls","ls_process","-l",NULL)<0){
                        std::cout<< "after execlp fail, pid=" << getpid() << std::endl;
                        exit(5);
                }
                exit(1);
        }else{ /*parent process*/
                std::cout<< "in parent process, pid=" << getpid() << std::endl;
                int child_pid = wait(&status);
                std::cout << "get child pid: " << child_pid << std::endl;
                if(WIFEXITED(status)>0){
                        std::cout << "WIFEXITED(status): " << WIFEXITED(status) << std::endl;
                        std::cout << "WEXITSTATUS(status): " << WEXITSTATUS(status) << std::endl;
                }
                else{
                        std::cout << "WIFEXITED(status): " << WIFEXITED(status) << std::endl;
                }
        }
}

result:
        可以看到,我們寫得exit(1)根本不會用到
        這邊get child pid其實拿到的是execlp的pid
        而execlp正常結束,所以WIFEXITED(status)會是true
        這個WEXITSTATUS(stauts)是沒有意義的



接著來一個execlp調用失敗的版本
//status_test.cpp
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <iostream>

int main(){
        std::cout<< "in main" << std::endl;
        int status;
        if(fork()==0){ /*child process*/
                std::cout<< "in child process, pid=" << getpid() << std::endl;
                if(execlp("lsxx","ls_process","-l",NULL)<0){
                        std::cout<< "after execlp fail, pid=" << getpid() << std::endl;
                        exit(5);
                }
                exit(1);
        }else{ /*parent process*/
                std::cout<< "in parent process, pid=" << getpid() << std::endl;
                int child_pid = wait(&status);
                std::cout << "get child pid: " << child_pid << std::endl;
                if(WIFEXITED(status)>0){
                        std::cout << "WIFEXITED(status): " << WIFEXITED(status) << std::endl;
                        std::cout << "WEXITSTATUS(status): " << WEXITSTATUS(status) << std::endl;
                }
                else{
                        std::cout << "WIFEXITED(status): " << WIFEXITED(status) << std::endl;
                }
        }
}

result:
        這邊可以看到,我們真的拿到WEXITSTATUS(stauts)是5
        而get child pid拿到的就真的是./status_test的pid
        而process正常結束,所以WIFEXITED(status)會是true
        這個WEXITSTATUS(stauts)才是真的有意義的


好了,今天的筆記到此結束
希望有幫助未來遺忘這些的自己,以及需要的人

留言

這個網誌中的熱門文章

python的list與numpy的array和matrix的關係