繁体   English   中英

如何从其父级恢复已暂停的子进程?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM