子进程即使在父进程退出后也会运行

Child Process runs even after parent process has exited?

本文关键字:运行 退出 进程 子进程      更新时间:2023-10-16

我正在为一个研究项目编写代码。我有以下要求: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) 语句将等待已终止的进程,这可能会导致一些问题。