为了运行程序,我写了一个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);
}
答案 0 :(得分:1)
setsid并不意味着核心转储不会产生。
我在环境内核3.10 x86_64上测试你的代码。在我的环境中,它总是在当前目录中生成核心转储。
检查生成核心转储的目录。
您可能需要更改[/ proc / sys / kernel /] core_pattern来更改目录。