2009-02-18 43 views
1

我想测试我的系统,并希望模拟子进程挂起的情况。为此,我正试图将子进程附加到GDB并在其上放置一段时间。但事情似乎没有像预期的那样进行。挂一个子进程

此外,我如何知道产生的子进程没有进展,但是被挂起?

回答

1

使用可以使用SIGSTOP来挂起一个子进程 - 但这与子进程进入无限循环或有条件的等待有明显不同 - 仍然可能足够接近进行测试。

要检查子进程没有挂起,你需要发送心跳给父母(你需要某种通信通道 - 至少stdin/stdout)。然后,如果孩子没有发送一些心跳消息,那么孩子已经挂了。

0

子进程将继承在fork之前创建的任何管道。你可以用它来“悬挂”你的孩子并让它知道什么时候继续。你可以让你的子进程在管道上尝试一个阻塞读操作,它会阻塞(即挂起),直到父进程写入内容为止。

你也可以使用Douglass提到的信号。您可以让操作系统进行基本的停止/继续操作,或者您可以执行信号处理程序来执行更复杂的操作(如进入无限循环)。

对于这两种

例子可以在Unix Programming FAQ一吨的过程控制,信号处理,管道等其他信息一起被发现...

你可以尝试寻找在/ proc,以确定是否被挂起。您可以读取/ proc/< child-pid >/stat以获取大量低级别进程信息,包括当前状态,进程已调度的用户/内核时间量,当前堆栈和指令指针等。 ..使用这个组合,你可以尝试确定过程是否挂起。查看proc(5)手册页获得/ proc/<pid>/stat的更多信息。