fork()之后的setsid()无法生成核心转储

时间:2015-12-09 09:55:41

标签: linux fork coredump

为了运行程序,我写了一个shell:

#!/bin/bash
ulimit -c unlimited
ulimit -n 65535
/usr/local/bin/myprogram -D #-D here means run in daemon 

当我运行命令时:kill -3 pid。 它不会生成核心转储文件。 删除" -D"来自shell(注意:程序不会在守护进程中运行),并运行命令" kill -3 pid",它将生成核心转储。

我想这可能是因为终端会话ID。

如何在守护进程中运行生成核心转储?

fork代码是:

void Daemonize()
{
    pid_t pid, sid;
    pid = fork();
    if (pid < 0) 
    {
        //Fork error
        exit(EXIT_FAILURE);
    } 
    else if (pid == 0)
    {
        //Child
        char *daemondir;
        umask(027);
        sid = setsid();//it's this cause that can't generate core dump 
        if (sid < 0)
            exit(EXIT_FAILURE);
        dosomething();
        ...
    }
    //Parent exits
    exit(EXIT_SUCCESS);
}

1 个答案:

答案 0 :(得分:1)

setsid并不意味着核心转储不会产生。

我在环境内核3.10 x86_64上测试你的代码。在我的环境中,它总是在当前目录中生成核心转储。

检查生成核心转储的目录。

您可能需要更改[/ proc / sys / kernel /] core_pattern来更改目录。