首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何理解孩子死于来自父母的记忆,甚至信号是"9“。

如何理解孩子死于来自父母的记忆,甚至信号是"9“。
EN

Stack Overflow用户
提问于 2013-09-12 08:03:46
回答 2查看 1.5K关注 0票数 0

我的项目运行了10个子进程,有一些内存泄漏,有时内存不足。

如果子进程与操作系统信号(例如信号11 )一起死亡,则父进程响应子进程。如果出现信号9,则不响应。因为,我可能确实需要信号9来终止进程(如提示killall -9 myproduct)。。

当childs使用极限内存操作系统(在我的例子中是FreeBSD 8.3 )向子节点发送信号9时,问题就开始了。但是,即使是信号9,我也希望恢复死进程,因为它不是由用户触发的。

你知不知道如何区分由于内存问题和用户触发的信号9。是否有任何C教程或示例代码可供您参考?

EN

回答 2

Stack Overflow用户

发布于 2013-09-12 08:15:29

你不能。你真的应该解决这个问题。大多数电脑在OOM杀手开机并释放内存之前,会发出尖锐的声音停止运转。如果您现在依赖OOM杀手重新启动应用程序,用户将不喜欢您。

现在是信号。手动你总是可以杀死父母,不是吗?因此,当子进程被杀死,但父进程没有时,您可以始终重新启动它。这并不能阻止你完全杀死孩子们。此外,默认情况下,kill发送信号SIGTERM,系统不会在错误时发送该信号,因此您可以使用它来终止应用程序。

票数 1
EN

Stack Overflow用户

发布于 2013-09-12 08:36:49

首先您应该修复内存泄漏。没有其他的工作了。

识别信号的来源:

请参考sigaction(2)siginfo_t参数对sa_sigaction是一个struct,包含以下元素:

代码语言:javascript
复制
       siginfo_t {
           int      si_signo;    /* Signal number */
           int      si_errno;    /* An errno value */
           int      si_code;     /* Signal code */
           int      si_trapno;   /* Trap number that caused
                                    hardware-generated signal
                                    (unused on most architectures) */
           pid_t    si_pid;      /* Sending process ID */
           uid_t    si_uid;      /* Real user ID of sending process */
           int      si_status;   /* Exit value or signal */
           clock_t  si_utime;    /* User time consumed */
           clock_t  si_stime;    /* System time consumed */
           sigval_t si_value;    /* Signal value */
           int      si_int;      /* POSIX.1b signal */
           void    *si_ptr;      /* POSIX.1b signal */
           int      si_overrun;  /* Timer overrun count; POSIX.1b timers */
           int      si_timerid;  /* Timer ID; POSIX.1b timers */
           void    *si_addr;     /* Memory location which caused fault */
           long     si_band;     /* Band event (was int in
                                    glibc 2.3.2 and earlier) */
           int      si_fd;       /* File descriptor */
           short    si_addr_lsb; /* Least significant bit of address
                                    (since kernel 2.6.32) */
       }

您可以如下所示标识源:

代码语言:javascript
复制
static void signal_handler(int sig, siginfo_t *siginfo, void *context)
{
    printf ("Sending PID: %ld, UID: %ld\n", (long)siginfo->si_pid,(long)siginfo->si_uid);
}

然而,SIGKILLSIGSTOP不能被拦截和处理。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18758740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档