我的项目运行了10个子进程,有一些内存泄漏,有时内存不足。
如果子进程与操作系统信号(例如信号11 )一起死亡,则父进程响应子进程。如果出现信号9,则不响应。因为,我可能确实需要信号9来终止进程(如提示killall -9 myproduct)。。
当childs使用极限内存操作系统(在我的例子中是FreeBSD 8.3 )向子节点发送信号9时,问题就开始了。但是,即使是信号9,我也希望恢复死进程,因为它不是由用户触发的。
你知不知道如何区分由于内存问题和用户触发的信号9。是否有任何C教程或示例代码可供您参考?
发布于 2013-09-12 08:15:29
你不能。你真的应该解决这个问题。大多数电脑在OOM杀手开机并释放内存之前,会发出尖锐的声音停止运转。如果您现在依赖OOM杀手重新启动应用程序,用户将不喜欢您。
现在是信号。手动你总是可以杀死父母,不是吗?因此,当子进程被杀死,但父进程没有时,您可以始终重新启动它。这并不能阻止你完全杀死孩子们。此外,默认情况下,kill发送信号SIGTERM,系统不会在错误时发送该信号,因此您可以使用它来终止应用程序。
发布于 2013-09-12 08:36:49
首先您应该修复内存泄漏。没有其他的工作了。
识别信号的来源:
请参考sigaction(2)。siginfo_t参数对sa_sigaction是一个struct,包含以下元素:
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不能被拦截和处理。
https://stackoverflow.com/questions/18758740
复制相似问题