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