gpt4 book ai didi

使用更多进程在 C 中捕获 SIGTERM

转载 作者:太空宇宙 更新时间:2023-11-04 03:10:39 25 4
gpt4 key购买 nike

我需要我的程序通过捕获 SIGTERM 信号正确终止其所有进程,甚至是 CTRL+C(我认为是 SIGINT)。我怎样才能修改它以使其工作?我试图只发布必要的代码,以免在程序运行时造成混淆,我只需要添加此信号管理。

include <signal.h>
int nproc = 10;
int listaPID[10];
int forkValue;

int main (void){
signal(SIGTERM,signalHandler);
//...
createSM();
for(int i=0; i<nproc; i++){
forkValue = fork();
if(forkValue == 0)
break;
listaPid[i] = forkValue;
}

if (forkValue==0){
//child's tasks
removeSM();
exit(0);
}
//parent's tasks
deleteSM();
exit(0);
}

void signalHandler(int sig){
//if parent, kill all of its childs + remove and delete shared memory + exit
if (forkValue>0){
for(int i=0;i<nproc;i++)
kill((listaPid[i]),SIGTERM);
deleteSM();
exit(0);
}
//if son, remove shared memory + exit
else {
removeSM();
exit(0);
}
}

最佳答案

^C生成 SIGINTR ,因此您还必须为该信号安装处理程序。可能您还需要为 SIGQUIT 安装所有信号处理程序(^] 中断键)和SIGHUP ( session 结束)除了SIGTERM .

从我的角度来看,如果你要杀死一个组中的所有进程,最好在父进程上创建一个进程组(setpgrp(0,0);,参见setpgrp(2)),然后杀死进程组(对于 kill(2) 一个进程组,您使用该组的 ID 更改了符号,kill(SIGTERM, -getpgrp());,(参见 kill(2)setpgrp(2) 的联机帮助页)

关于使用更多进程在 C 中捕获 SIGTERM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56724306/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com