【发布时间】:2009-02-18 10:47:23
【问题描述】:
我正在尝试测试我的系统并希望模拟子进程挂起的情况。为此,我试图将子进程附加到 GDB 并对其进行中断。但事情似乎并不像预期的那样发展。
同样,我怎么知道衍生的子进程没有进行,而是挂起?
【问题讨论】:
标签: parent-child unix
我正在尝试测试我的系统并希望模拟子进程挂起的情况。为此,我试图将子进程附加到 GDB 并对其进行中断。但事情似乎并不像预期的那样发展。
同样,我怎么知道衍生的子进程没有进行,而是挂起?
【问题讨论】:
标签: parent-child unix
使用可以使用 SIGSTOP 挂起子进程 - 但这与子进程进入无限循环或糟糕的条件等待明显不同 - 仍然可能足够接近测试。
要检查子进程是否挂起,您可以让它向父进程发送心跳(为此您需要某种通信通道 - 至少可能是标准输入/标准输出)。如果孩子未能发送几次心跳消息,则孩子挂起。
【讨论】:
子进程将继承在 fork 之前创建的所有管道。您可以使用它来“挂”您的孩子并让它知道何时继续。您可以让您的子进程尝试在管道上进行阻塞读取,它会阻塞(即挂起)直到父进程写入。
您也可以使用道格拉斯提及的信号。你可以让操作系统做基本的停止/继续,或者你可以实现信号处理程序来做一些更复杂的事情(比如进入一个无限循环)。
可以在Unix Programming FAQ 中找到这两个示例以及有关过程控制、信号处理、管道等的大量附加信息...
您可以尝试查看 /proc 以确定您是否挂起。你可以阅读 /proc/
【讨论】: