我想在自己的进程组中启动一个进程(或者,启动后更改其组)并且:
- 让组中的进程响应
Ctrl
+ C
从航站楼
- 获取进程组的id,以便我可以通过以下方式终止组中的所有进程
kill
命令。
注意:我尝试过setsid prog [args]
但进程不响应终端的 Ctrl+C,我也无法获取新的进程组 ID。
我还尝试通过 Perl 更改进程组setpgrp($pid, $pid)
and POSIX::setpgid($pid, $pid)
,无济于事。
编辑:更大的问题:
我有一个进程(单线程;我们称其为“多产”进程P
)同步启动许多子进程(一个接着一个;当前一个子进程终止时,它启动一个新的子进程)。从终端,我希望能够杀死P
以及它下面的进程树。为此,我可以简单地安排终止以下进程P
的组。但是,默认行为是P
位于其父进程的组中。这意味着P
如果我杀死其中的所有进程,则 的父进程将被杀死P
的小组,除非我有P
和它的树在自己的组中。
我的目的是杀人P
和它下面的树,但不是P
的父母。另外,我无法修改P
的代码本身。
“在自己的进程组中启动进程”是什么意思? shell 在自己的进程组中启动进程,这就是它进行作业控制的方式(通过为前台进程提供一个进程组,并为在后台启动的每个管道提供多个进程组)。
要查看 shell 为每个管道启动一个新的进程组,您可以执行以下操作:
ps fax -o pid,pgid,cmd | less
这将显示类似以下内容:
11816 11816 | \_ /bin/bash
4759 4759 | \_ ps fax -o pid,pgid,cmd
4760 4759 | \_ less
请注意,shell 为管道创建了一个新的进程组,并且管道中的每个进程共享该进程组。
Edit:
我想我知道你在说什么。你正在呼唤system
来自珀尔。显然,sh -c
不会创建新的进程组,因为它是一个没有作业控制的 shell。
我会做的是fork
,然后对孩子:
setpgrp;
system("ps fax -o pid,pgid,cmd");
and wait
在父母身上。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)