[英]How can I resume a paused child process from its parent?
我对控制流程有多少方式感到不知所措,例如wait()pause()信号处理等。我想要的是恢复已暂停的过程,然后在执行pause()语句后执行该行,如下所示:
/* Child code */
pause();
execvp(args[index], args);
我的过程的拓扑是线性子代。 一位父母,n个孩子,没有孙子。 因此,在父级完成分叉之后,我让它运行此循环以尝试按顺序唤醒它们:
// Parent iterates through n child processes
for (i = 0; i < n; i++) {
// Need to unpause here, do i need signals?
signal(SIGCONT, sighandler);
// I don't know what im doing
}
wait(&status);
如果有帮助,我可以获取它们的进程ID,但是我不知道如何处理它们。
从pause(2)手册页 (重点是我的):
pause()使调用进程(或线程)进入休眠状态, 直到传递了终止该进程或导致调用信号捕获功能的信号为止 。
更具体地说:
pause()仅在捕获到信号并且返回信号捕获函数时返回。
这意味着要让您的孩子取消暂停,您需要向其发送信号(可能还需要自定义信号处理程序)。
这是一个简单的信号处理功能-通常将它们放在页面顶部(在导入下)或头文件中。
void handleContinueSignal(int sig) {
myGlobalStaticContinueVariable = 1; // Or some other handling code
}
这就是您宣布信号处理功能应该与SIGCONT
信号相关联的方式,如果该信号曾经被接收到的话。 您可能只希望您的子进程运行此行。 不过,请确保将其放在暂停之前-使信号处理程序运行是新进程应该做的第一件事。
signal(SIGCONT, handleContinueSignal); // Name of the signal handling function
最后,您可以通过给它的PID来让您的父母向孩子发送SIGCONT
信号,如下所示:
kill(yourChildPID, SIGCONT);
对于您的代码,您必须制作一个父循环,并为每个孩子的PID调用一次,这将依次唤醒每个孩子的PID。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.