小编Ali*_*scu的帖子

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

我正在尝试编写一个生成子进程的函数,让它运行一段时间然后如果它还没有完成就杀死它:

int sysExecTimeout(const char * exePath, int timeoutSec);
Run Code Online (Sandbox Code Playgroud)

在功能方面,我使用forkexecl产卵的孩子,而且,当它超时,我用kill(pid, SIGTERM)kill(pid, SIGKILL)2秒后,为保证儿童死亡:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用Linux,似乎当父进程终止时,子进程不会自动被杀死.所以这两个kill调用只会终止/bin/sh进程并让exePath命令继续运行,因为它是一个子进程/bin/sh.

我正在尝试编写sysExecTimeout函数,以便它杀死整个进程树pid,其中pidPID来自pid = fork()

我需要这个,因为该exePath命令将产生其他命令,这些命令也可能产生其他命令,这些命令可能会卡住并消耗资源.

我无法控制exePath执行的二进制文件/脚本,因此我无法在其中编写自己的parent-dies-so-kill-the-children逻辑.

我尝试使用kill(0, SIGTERM),几乎完成了这项工作,除了它也杀了我自己的进程:)

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

c linux tree kill process

4
推荐指数
1
解决办法
2万
查看次数

每个文件递归地用四个空格替换每个前导标签

什么是最容易实现Linux中的这个使用常用工具的方法是什么?

我看了看:

  1. sed,但是对如何计算类似的表达式中匹配的前导制表符还不了解sed -i 's/^[\t]*/<what-to-put-here?>/g myFile.c
  2. astyle,但无法弄清楚如何重新缩进和不格式化
  3. indent,与astyle一样的问题
  4. expand,但它也替换了非前导标签,并且我必须亲自处理就地替换,这很容易出错。

我只是在寻找一种快速简便的解决方案,可以将其插入 find -type f -name "*.c" -exec '<tabs-to-spaces-cmd> {}' \;

regex sed indentation

4
推荐指数
2
解决办法
766
查看次数

标签 统计

c ×1

indentation ×1

kill ×1

linux ×1

process ×1

regex ×1

sed ×1

tree ×1