【发布时间】:2015-03-09 20:43:10
【问题描述】:
我在 c 中使用并发,我有一个进程池。为此,我将每个孩子都放在一个 While (True) 循环中。杀死孩子我正在使用全局变量和信号处理程序来修改它打破循环。
问题是,孩子们使用分配的内存,我想释放它。因此,使用来自父级的简单 SIGTERM 是行不通的。
全球:
int sigusr1_count = 0;
void SenalTerminacion() {
++sigusr1_count;
}
signal(SIGUSR1, SenalTerminacion);
孩子:
While (1) {
if (sigusr1_count != 0) {
break;
}
/* some calculations */
}
print("Hola Stack Overflow\n");
/* freeing memory */
exit(0);
父亲:
kill(pidChild, SIGUSR1);
wait(NULL);
如果我用 wait 注释掉该行,代码将起作用并显示消息。但如果我离开等待程序挂起。我可以想象孩子不会因为我不知道信号和等待的奇怪东西而结束。我有 n 个孩子。 先感谢您!
【问题讨论】:
-
是否需要使用信号?您可以使用其他 IPC,例如管道或 unix 域套接字。
-
“分配的内存”是什么意思?只是
malloc()和free()?如果是这样,您可以使用SIGTERM,因为当操作系统清理进程时,所有内存都会自动释放。 -
我正在这样做,而 valgrind 正在识别内存泄漏