我写了一个程序,用fork()分叉一些进程。如果出现错误,我想杀死所有孩子和母亲的过程。如果我使用exit(EXIT_FAILURE),则只会杀死子进程。
我正在考虑一个系统(“killall [program_name]”),但必须有更好的方法......
谢谢大家! 伦纳特
答案 0 :(得分:5)
在UNIX下,发送SIGTERM,SIGABRT或SIGPIPE或sth。与母亲的过程相似。如果它们没有明确地阻止或忽略它,那么该信号将自动传播到所有客户端。
使用getppid()
获取PID以发送信号,并kill()
发送信号。
getppid()返回进程ID 调用过程的父级。
kill()系统调用可用于向任何进程组或进程发送任何信号。
说明:
1.使用system
是邪恶的。使用内部功能发送信号。
2. killall
会更加邪恶。考虑一次运行程序的几个实例。
答案 1 :(得分:2)
请参阅How to make child process die after parent exits?
在Linux上有一个prctl()
调用,它明确地设计为当父母因为某种原因而死去时向所有进程的子节点发送信号。
我需要检查并且不能在第二个位置进行检查,但我真的不确定ypnos关于SIGPIPE
,SIGTERM
和SIGABRT
的断言是什么传播给所有孩子是正确的。
但是如果你使用kill(-ppid)
(注意减号),那么只要孩子们仍在父进程的进程组中,内核就会向所有孩子发送任何信号。
答案 2 :(得分:1)
如果您的母进程未通过命令行启动,则可能不是 过程组领导,就像一个守护者。
要确保您的母进程是进程组负责人,请在执行期间调用setsid() 你的流程初始化。
然后在您的子进程中,如果您想要退出所有进程:
pgid = getpgid();
杀死(pgid,15);
你也可以做一些技巧,比如告诉所有兄弟姐妹暂停:
杀人(pgid,20);
简历:
杀死(pgid,18);
答案 3 :(得分:0)
考虑自杀方法 - 在过程开始时(父母和孩子)设置一个alarm()
,并且有一些正数秒。如果计算在该时间内完成并且“没有错误”,则调用alarm(0)
取消定时器;否则SIGALRM
将终止进程(假设你没有明确地捕获或忽略它。)
嗯,对此提起诉讼而不是仅仅进行投票:)