我写了一个程序,用 fork() 分叉一些进程。如果出现错误,我想杀死所有子进程和母进程。如果我使用 exit(EXIT_FAILURE) 只有子进程被杀死。
我正在考虑一个系统(“killall [program_name]”),但必须有更好的方法......
谢谢你们!伦纳特
在 UNIX 下,发送 SIGTERM,或 SIGABRT,或 SIGPIPE 或 sth。类似于母进程。如果他们没有明确地阻止或忽略它,这个信号将自动传播到所有客户端。
用于getppid()
获取 PID 发送信号,并kill()
发送信号。
getppid() 返回调用进程的父进程 ID。
kill() 系统调用可用于向任何进程组或进程发送任何信号。
备注: 1、用system
为恶。使用内部函数发送信号。2.killall
会更邪恶。考虑一次运行的程序的多个实例。
在 Linux 上,有一个调用明确设计用于在父进程因任何原因prctl()
死亡时向所有进程的子进程发送信号。
我需要检查并且不能在第二个位置执行此操作,但是我真的不确定 ypnos 关于SIGPIPE
,SIGTERM
并SIGABRT
传播给所有孩子的断言是否正确。
但是,如果您使用kill(-ppid)
(注意减号),那么只要子进程仍在父进程的进程组中,内核就会向所有子进程传递任何信号。
如果你的母进程不是命令行启动的,它可能不是进程组长,就像一个守护进程一样。
为确保您的母进程是进程组组长,请在进程初始化期间调用 setsid()。
然后在你的子进程中,如果你想让所有进程退出:
pgid = getpgid();
杀死(pgid,15);
你也可以做一些技巧,比如告诉你所有的兄弟姐妹暂停:
杀死(pgid,20);
并继续:
杀死(pgid,18);
考虑自杀方法 -alarm()
在过程开始时(父母和孩子)设置一个正数秒数。如果计算在该时间内完成并且“没有错误”,则调用alarm(0)
取消计时器;否则SIGALRM
将终止该过程(假设您没有明确地捕获或忽略它。)
好吧,提出反对这个的理由,而不是仅仅投反对票:)