0

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

如果子进程死于操作系统信号(例如信号 11),父进程会重新生成子进程。并且在信号 9 的情况下不会重新生成,因为,我可能真的需要信号 9 来终止进程(比如提示 killall -9 myproduct)。.

问题开始了,当孩子使用极端内存操作系统(在我的情况下为 FreeBSD 8.3)向孩子发送信号 9 时。但即使是信号 9,我也想重新生成死进程,因为它不是由用户触发的。

您知道如何区分由于内存问题引起的信号 9 和由用户触发的信号吗?有没有你可以建议的 C 教程或示例代码?

4

2 回答 2

1

首先,您应该修复内存泄漏。没有其他解决方法。

要识别信号源:

请参考sigaction(2)。to的siginfo_t参数sa_sigactionstruct具有以下元素的 a:

       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) */
       }

您可以通过以下方式识别来源:

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);
}

但是,SIGKILL并不SIGSTOP能被拦截和处理。

于 2013-09-12T08:36:49.767 回答
1

你不能。你真的应该解决这个问题。在 OOM 杀手启动并释放内存之前,大多数计算机都会停止运转。如果您现在和之后依靠 OOM 杀手重新启动您的应用程序,用户将不会喜欢您。

现在到信号。手动你总是可以杀死父母,不是吗?因此,当孩子被杀死但父母没有被杀死时,您总是可以重新启动它。它不会阻止你完全杀死孩子。同样 kill 默认发送信号 SIGTERM 并且系统从不发送错误信号,因此您可以使用它来终止应用程序。

于 2013-09-12T08:15:29.643 回答