【问题标题】:fork(), child process not dumping core, parent process does finefork(),子进程不转储核心,父进程正常
【发布时间】:2018-07-31 10:26:00
【问题描述】:

“ulimit -c unlimited”已经完成。代码如下:

main()
{
        do
        {
            pid_t pid = fork();
            int stat_loc;
            if(pid < 0)
                exit(1);
            else if(pid > 0)
            {
                waitpid(pid, &stat_loc, 0);
                sleep(5);
            }
            else
                break;
        }
        while(1);

        assert(0);
}

如果我用 assert(0) 替换 sleep(5),父进程会转储核心。

【问题讨论】:

  • 它适用于 Linux 内核 4.17、glibc 2.27、amd64。
  • 发布的代码缺少所需头文件所需的 #include 语句。所以它不编译!函数main() 的返回类型始终为int,而不是空白
  • 请发minimal reproducible example,以便我们为您提供帮助
  • 建议将if(pid &lt; 0) exit(1); 替换为if(pid &lt; 0) { perror( "fork failed" ); exit(1); } 这样用户/您就会知道为什么调用fork() 失败
  • 代码只是伪代码,给你一个想法。

标签: c fork


【解决方案1】:

在应用程序的调试版本上调用 assert(0) should cause an abort

如果此函数形式的宏的参数表达式比较等于零(即表达式为假),则将一条消息写入标准错误设备并调用 abort,终止程序执行。

您实际上想在这里做什么?看起来您的分叉逻辑可能有问题。通常,您会测试 pid == 0 以查看您是否在子进程中,而 pid > 0 以查看您是否在父进程中,like this

pid_t pid = fork();
if (pid == 0) {
    // child process because return value zero
    printf("Hello from Child!\n");
} else if (pid > 0) {
    // parent process because return value non-zero.
    printf("Hello from Parent!\n");
} else {
    printf("Error occurred.\n");
}

在您的问题中,您正在检查 > 0 和

编辑:添加错误检查分支。

【讨论】:

  • 这个答案具有误导性。因为函数:fork() 有三种返回 1) 0 表示在父进程中。代码需要检查所有三个条件并采取相应的行动
  • 同意。相应地修改了我的答案。
  • assert(0) 已被故意调用以使应用程序转储核心。该代码仅用于测试。分叉逻辑很好 - 父进程将在循环内继续,子进程将执行 assert(0)。请注意,如果我将 sleep(5) 替换为 assert(0),则父核心转储不会出现问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-06
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
相关资源
最近更新 更多