父进程退出后,子进程仍会运行吗?

时间:2018-03-21 09:21:54

标签: c++ g++ centos7

我正在编写研究计划的代码。我有以下要求: 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分钟的父母退出但孩子仍在跑步时。

通常情况下,当父母退出时,孩子会自动死亡。

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

1 个答案:

答案 0 :(得分:1)

  

通常情况下,当父母退出时,孩子会自动死亡。

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

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