linux c程序杀死进程,如何使用C在Linux上以编程方式杀死进程树

我正在尝试编写一个生成子进程的函数,让其运行一定的时间,如果尚未完成,则将其杀死:

int sysExecTimeout(const char * exePath, int timeoutSec);

在函数中,我使用fork和execl生成子代,并且在超时时,在2秒后使用kill(pid, SIGTERM)和kill(pid, SIGKILL)来确保子代死亡:

pid_t pid = fork();

if(pid == 0) {

execl("/bin/sh","sh","-c", exePath);

exit(127);

} else if(pid != -1) {

// timeout code

if(timeout) {

kill(pid, SIGTERM);

sleep(2);

kill(pid, SIGKILL);

}

}

我正在使用Linux,看来当父进程死亡时,不会自动杀死该子进程。因此,这两个kill调用将终止/bin/sh进程,并使exePath命令保持运行状态,因为它是/bin/sh的子进程。

我试图编写sysExecTimeout函数,使其杀死以pid为根的整个进程树,其中pid是pid = fork()的PID

我需要这样做,因为exePath命令将生成其他命令,这些命令也可以生成其他命令,这些命令可能会卡住并消耗资源。

我无法控制要执行的exePath二进制文件/脚本,因此我无法在其中编写自己的父-母-子-杀死儿童逻辑。

我尝试使用kill(0, SIGTERM)几乎完成了任务,除了它还杀死了我自己的进程:)

我想知道是否可以在C中以编程方式打开一个标志,说"嘿,我死了,带走我所有的孩子并杀死他们,并为他们的孩子递归重复",这样整个进程树都从该程序开始死亡(假设可以遵循PID / PPID链)。

我可以在这里使用该标志:

if(pid == 0) {

turnOnRecursiveDeathFlag();

system(exePath);

//execl("/bin/sh","sh","-c", exePath);

exit(127);

}

有没有办法做到这一点?我已经搜索了一段时间,但是我所能找到的只是使用ps -ef的骇客,或者修改了您正在运行的子进程等。

} else if(pid == -1) {:这表明fork()而不是子进程存在问题。

是的,抱歉,这是一个错字:)

在子级中使用setpgid将其GPID设置为其自己的PID。 然后,父级可以杀死(-pid,...)以向整个组发出信号。

pid_t pid = fork();

if(pid == 0) {

setpgid(0, 0);

execl("/bin/sh","sh","-c", exePath);

exit(127);

} else if(pid == -1) {

// timeout code

if(timeout) {

kill(-pid, SIGTERM);

sleep(2);

kill(-pid, SIGKILL);

}

}

那应该做。

还有一件事,当生成外壳时,请确保它不启用作业控制。 否则,它将创建自己的进程组。 您的" / bin / sh -c"很好。

太好了,这似乎可行,谢谢! 我不确定处理进程组ID是什么(这仅仅是一个进程的GID吗?),但是我正在研究它。

顺便说一句,由于我无法编辑您的帖子,因此您应该将setgpid更改为setpgid,这似乎是正确的名称。

我为他修复了@AlinTomescu ...或者我想它正在接受审查

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值