1

我写了一个程序,用 fork() 分叉一些进程。如果出现错误,我想杀死所有子进程和母进程。如果我使用 exit(EXIT_FAILURE) 只有子进程被杀死。

我正在考虑一个系统(“killall [program_name]”),但必须有更好的方法......

谢谢你们!伦纳特

4

4 回答 4

5

在 UNIX 下,发送 SIGTERM,或 SIGABRT,或 SIGPIPE 或 sth。类似于母进程。如果他们没有明确地阻止或忽略它,这个信号将自动传播到所有客户端。

用于getppid()获取 PID 发送信号,并kill()发送信号。

getppid() 返回调用进程的父进程 ID。

kill() 系统调用可用于向任何进程组或进程发送任何信号。

备注: 1、用system为恶。使用内部函数发送信号。2.killall会更邪恶。考虑一次运行的程序的多个实例。

于 2009-05-22T10:57:19.197 回答
2

请参阅如何在父退出后使子进程死亡?

在 Linux 上,有一个调用明确设计用于在父进程因任何原因prctl()死亡时向所有进程的子进程发送信号。

我需要检查并且不能在第二个位置执行此操作,但是我真的不确定 ypnos 关于SIGPIPE,SIGTERMSIGABRT传播给所有孩子的断言是否正确。

但是,如果您使用kill(-ppid)(注意减号),那么只要子进程仍在父进程的进程组中,内核就会向所有子进程传递任何信号。

于 2009-05-22T11:49:27.827 回答
1

如果你的母进程不是命令行启动的,它可能不是进程组长,就像一个守护进程一样。

为确保您的母进程是进程组组长,请在进程初始化期间调用 setsid()。

然后在你的子进程中,如果你想让所有进程退出:

pgid = getpgid();
杀死(pgid,15);

你也可以做一些技巧,比如告诉你所有的兄弟姐妹暂停:

杀死(pgid,20);

并继续:

杀死(pgid,18);

于 2009-05-22T15:51:17.463 回答
0

考虑自杀方法 -alarm()在过程开始时(父母和孩子)设置一个正数秒数。如果计算在该时间内完成并且“没有错误”,则调用alarm(0)取消计时器;否则SIGALRM将终止该过程(假设您没有明确地捕获或忽略它。)

好吧,提出反对这个的理由,而不是仅仅投反对票:)

于 2009-05-22T13:24:48.727 回答