用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)才是真的有意義的希望有幫助未來遺忘這些的自己,以及需要的人

留言
張貼留言