用wait取得exit status
這篇是延伸自fork的文章裡面提到的wait函式
那篇裡面只有簡單的使用wait避免產生zombie process
而今天這篇的重點是在exit status的取得
是一個還蠻實用的技巧
以下是一個簡單的小範例實驗
先來一個execlp正常運作版本
result:
result:
好了,今天的筆記到此結束
希望有幫助未來遺忘這些的自己,以及需要的人
那篇裡面只有簡單的使用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)才是真的有意義的希望有幫助未來遺忘這些的自己,以及需要的人
留言
張貼留言