gpt4 book ai didi

c++ - 即使在父进程退出后子进程仍在运行?

转载 作者:行者123 更新时间:2023-11-28 04:45:06 33 4
gpt4 key购买 nike

我正在为一个研究项目编写代码。我有以下要求:1. 主要二进制执行从 main() 开始2.主() 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;
}

child 会退出,然后 parent 退出,但由于某些未知原因,16 分钟后 parent 退出,但 child 仍在运行。

通常情况下,当 parent 退出时, child 会自动死亡。

这种奇怪行为的原因可能是什么???

最佳答案

Normally It is said that when parent exits the child dies automatically.

这并不总是正确的,它取决于系统。当父进程终止时,子进程称为孤儿进程。在类 Unix 操作系统中,这是通过将孤立进程的父进程与 init 进程相关联来管理的,这称为重新父级,它由操作系统自动管理。在其他类型的操作系统中,孤立进程会被系统自动杀死。您可以找到更多详细信息 here .

根据代码片段,我认为问题可能出在 wait(&status) 语句中。当返回状态为 0 时,上一个循环将结束(或不执行),这是最后一个 return 0 的默认返回值,可以由上一个 产生waitpid(child_pid, &status, WNOHANG) 语句。这意味着 wait(&status) 语句将等待一个已经终止的进程,这可能会导致一些问题。

关于c++ - 即使在父进程退出后子进程仍在运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49402357/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com