子进程即使在父进程退出后也会运行
Child Process runs even after parent process has exited?
我正在为一个研究项目编写代码。我有以下要求:1. 主二进制文件执行从 main(( 开始2. 主(( 叉((3. 子进程使用 execvp(( 运行 linpack 基准测试二进制文件4. 父进程运行一些监视进程并等待子进程退出。
代码如下:
主.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 分钟后父母退出但孩子仍在运行。
通常,据说当父母退出时,孩子会自动死亡。
这种奇怪行为的原因可能是什么???
通常,据说当父母退出时,孩子会自动死亡。
好吧,这并不总是正确的,这取决于系统。当父进程终止时,子进程称为孤立进程。在类Unix操作系统中,这是通过将孤立进程的父进程与init
进程相关联来管理的,这称为重新设定父级,它由操作系统自动管理。在其他类型的操作系统中,孤立进程由系统自动终止。您可以在此处找到更多详细信息。
从代码片段中,我认为问题可能出在wait(&status)
语句中。当返回状态为 0 时,上一个循环将结束(或不执行(,这是最后最终return 0
的默认返回值,可以由前面的 waitpid(child_pid, &status, WNOHANG)
语句生成。这意味着 wait(&status)
语句将等待已终止的进程,这可能会导致一些问题。
相关文章:
- 运行Qt时处理退出代码0xC0000135 hello world
- 继续运行程序而无需任何干预,直到要求退出为止
- 运行自定义可执行文件,QProcess 立即退出,退出代码为 1
- 在GDB中:在启动程序中以代码1退出.在GDB之外运行良好
- 如何使功能"run"工作。程序在调用运行时退出
- 子进程即使在父进程退出后也会运行
- 如何运行进程,然后在它退出时收到通知
- 薄板样条形状转换运行时错误 [使用代码 -1073741819 退出]
- 在 gdb 中运行 c++ 代码时出错:[下级 1(进程 9985)正常退出]
- 我想让程序保持运行,直到用户输入 n 退出程序
- 如何停止任务运行终端在程序以视觉工作室代码结束后自动退出
- 在父母获得杀死信号和退出后,用system()产生的儿童进程继续运行
- 在另一个线程正在运行的情况下退出应用程序时出错
- 我找不到导致我的数组在运行两次案例并退出后损坏的错误
- 在类中运行析构函数时退出程序
- 如何在选择错误选项时保持程序运行而不退出
- C++ 运行失败:退出值 2 - 我的代码出了什么问题?
- QT/C++,OS X:退出应用程序时可选择隐藏(),以便应用程序继续运行,并在单击dock中的图标后再次显示
- 使用Runtime.exec从Java运行进程-退出代码139
- 当我在代码中使用 "string" 命令时,NetBeans C++ 将生成但不运行(退出值 127)