【问题标题】:Child Process runs even after parent process has exited?即使在父进程退出后子进程也会运行?
【发布时间】:2018-08-30 08:07:09
【问题描述】:

我正在为一个研究项目编写代码。我有以下要求: 1. 主二进制执行从 main() 开始 2. main() fork() 3. 子进程使用 execvp() 运行 linpack 基准二进制文件 4.父进程运行一些监控进程,等待子进程退出。

代码如下:

ma​​in.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 分钟后由于某些未知原因,父母退出但孩子仍在运行。

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

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

【问题讨论】:

  • 你应该检查wait的返回值。它可能会因某种原因而中断。

标签: c++ g++ centos7


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 2020-03-04
    • 2021-10-30
    • 2020-05-06
    • 2022-12-12
    • 1970-01-01
    相关资源
    最近更新 更多