我正在编写研究计划的代码。我有以下要求: 1.主二进制执行从main()开始 2. main()fork() 3.子进程使用execvp()运行linpack基准二进制文件 4.父进程运行一些监视进程并等待子进程退出。
代码如下:
的main.cpp
extern ServerUncorePowerState * BeforeStates ;
extern ServerUncorePowerState * AfterStates;
int main(int argc, char *argv[]) {
power pwr;;
procstat st;
membandwidth_t data;
int sec_pause = 1; // sample every 1 second
pid_t child_pid = fork();
if (child_pid >= 0) { //fork successful
if (child_pid == 0) { // child process
int exec_status = execvp(argv[1], argv+1);
if (exec_status) {
std::cerr << "execv failed with error "
<< errno << " "
<< strerror(errno) << std::endl;
}
} else { // parent process
int status = 1;
waitpid(child_pid, &status, WNOHANG);
write_headers();
pwr.init();
st.init();
init_bandwidth();
while (status) {
cout << " Printing status Value: " << status << endl;
sleep (sec_pause);
time_t now;
time(&now);
struct tm *tinfo;
tinfo = localtime(&now);
pwr.loop();
st.loop();
data = getbandwidth();
write_samples(tinfo, pwr, st, data.read_bandwidth + data.write_bandwidth);
waitpid(child_pid, &status, WNOHANG);
}
wait(&status); // wait for child to exit, and store its status
//--------------------This code is not executed------------------------
std::cout << "PARENT: Child's exit code is: "
<< WEXITSTATUS(status)
<< std::endl;
delete[] BeforeStates;
delete[] AfterStates;
}
} else {
std::cerr << "fork failed" << std::endl;
return 1;
}
return 0;
}
预计孩子会退出然后父母退出,但由于一些未知的原因,在16分钟的父母退出但孩子仍在跑步时。
通常情况下,当父母退出时,孩子会自动死亡。
这种奇怪行为可能是什么原因???
答案 0 :(得分:1)
通常情况下,当父母退出时,孩子会自动死亡。
嗯,这并非总是如此,这取决于系统。当父进程终止时,子进程称为孤立进程。在类Unix操作系统中,这是通过将孤立进程的父进程与init
进程相关联来管理的,这称为重新父进程,它由操作系统自动管理。在其他类型的操作系统中,孤立进程会被系统自动杀死。您可以找到更多详细信息here。
从代码片段中我会想到问题可能在wait(&status)
语句中。当返回状态为0时,前一个循环将结束(或不执行),这是最后return 0
末尾的默认返回值,可以由之前的waitpid(child_pid, &status, WNOHANG)
语句产生。这意味着wait(&status)
语句将等待已经终止的进程,这可能会导致一些问题。