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

时间:2017-07-25 04:29:19

标签: c

我对控制进程的方式有点不知所措,例如wait()pause()信号处理等。我想要的是恢复暂停的进程,然后在pause()语句之后执行该行,像这样:

/* Child code */
pause();
execvp(args[index], args);

我的进程的拓扑结构是线性子代。一个父母,一个孩子,没有孙子。所以在父母完成分叉之后,我让它运行这个循环以尝试按顺序唤醒它们:

// 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,但我不知道如何处理它们。

1 个答案:

答案 0 :(得分:1)

来自pause(2) man page(强调我的):

  

pause()使调用进程(或线程)休眠,直到传递的信号终止进程或导致调用信号捕获函数

更具体地说:

  

pause()仅在捕获到信号并返回信号捕获函数时返回。

这意味着您的孩子要取消暂停,您需要向其发送信号(可能还有自定义信号处理程序)。

这是一个简单的信号处理功能 - 通常将它们放在页面的顶部(在导入下)或头文件中。

void handleContinueSignal(int sig) {
    myGlobalStaticContinueVariable = 1; // Or some other handling code
}

这就是你宣布你的信号处理功能应该与SIGCONT信号相关联的方式。您可能只希望子进程运行此行。确保你在暂停之前把它放进去 - 让信号处理程序运行是新进程应该做的第一件事。

signal(SIGCONT, handleContinueSignal); // Name of the signal handling function

最后,你可以让你的父母给孩子发一个SIGCONT信号,给他的PID如下:

kill(yourChildPID, SIGCONT);

对于你的代码,你必须进行父循环,并为每个孩子的PID调用一次,这将依次唤醒它们中的每一个。