我正在尝试测试我的系统并希望模拟子进程挂起的情况。为此,我试图将子进程附加到 GDB 并对其进行中断。但事情似乎并不像预期的那样发展。
此外,同样,我怎么知道生成的子进程没有进行,而是挂起?
我正在尝试测试我的系统并希望模拟子进程挂起的情况。为此,我试图将子进程附加到 GDB 并对其进行中断。但事情似乎并不像预期的那样发展。
此外,同样,我怎么知道生成的子进程没有进行,而是挂起?
使用可以使用 SIGSTOP 挂起子进程 - 但这与子进程进入无限循环或糟糕的条件等待明显不同 - 仍然可能足够接近测试。
要检查子进程是否挂起,您可以让它向父进程发送心跳(为此您需要某种通信通道 - 至少可能是标准输入/标准输出)。如果它未能发送几个心跳消息,那么这个孩子就会挂起。
子进程将继承在 fork 之前创建的任何管道。您可以使用它来“挂”您的孩子并让它知道何时继续。您可以让您的子进程尝试在管道上进行阻塞读取,它会阻塞(即挂起)直到父进程写入某些内容。
你也可以使用道格拉斯提到的信号。你可以让操作系统做基本的停止/继续,或者你可以实现信号处理程序来做一些更复杂的事情(比如进入一个无限循环)。
可以在Unix Programming FAQ中找到这两个示例,以及有关进程控制、信号处理、管道等的大量附加信息......
您可以尝试查看 /proc 以确定您是否挂起。你可以阅读 /proc/<child-pid>/stat 来获取很多低级进程信息,包括当前状态、进程已调度的用户/内核时间量、当前堆栈和指令指针等。 .. 结合使用,您可以尝试确定进程是否挂起。查看proc(5)手册页以获取有关 /proc/<pid>/stat 的更多信息。