Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何从父进程恢复暂停的子进程?_C - Fatal编程技术网

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

C 如何从父进程恢复暂停的子进程?,c,C,我有点被控制进程的方法弄得不知所措,比如wait()pause()信号处理等。我只想恢复一个暂停的进程,然后在pause()语句之后执行该行,如下所示: /* Child code */ pause(); execvp(args[index], args); 我的进程的拓扑是线性子进程。单亲,n个孩子,没有孙子女。因此,在父对象完成分叉后,我让它运行此循环,尝试按顺序唤醒它们: // Parent iterates through n child processes for (i = 0; i

我有点被控制进程的方法弄得不知所措,比如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);
//父进程遍历n个子进程
对于(i=0;i
如果有帮助的话,我可以获得他们的进程ID,但我不知道如何处理它们。

来自(我的重点):

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

更具体地说:

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

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

这是一个简单的信号处理函数,通常放在页面顶部(在导入下)或头文件中

void handleContinueSignal(int sig) {
    myGlobalStaticContinueVariable = 1; // Or some other handling code
}
这就是你如何宣布你的信号处理功能应该与
SIGCONT
信号相关联,如果它曾经被接收到的话。您可能只希望您的子进程运行此行。但要确保在暂停之前将其放入,让信号处理程序运行是新进程应该做的第一件事

signal(SIGCONT, handleContinueSignal); // Name of the signal handling function
最后,您可以让您的家长通过如下方式给孩子发送一个
SIGCONT
信号:

kill(yourChildPID, SIGCONT);

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

printf
不应从信号处理程序中调用。而是设置一个标志,并基于该标志在处理程序外部调用
printf
。总是看到良好的实践。注意,我理解您的意思,
printf
只是一种显示信号被捕获的方式,并不打算作为处理程序的一个组成部分——但值得一提,而且没有任何疑问
:)
有没有办法在信号中使用PIDs来指定要取消捕获的信号?我想我真的很难理解信号是如何发送和接收的如果我是你,那么我会把所有孩子的PID做一个数组。这样你就可以循环发送一个
SIGCONT
,或者每秒钟发送一个,等等,听起来像是我想要的,但我不知道如何指定谁获得信号。我的信号会发送给所有的孩子还是特定的孩子?我是否需要信号以某种方式指定PID,如果它同时发送给所有的PID,以区分它的目的是谁?旁注:函数将只等待“直到它的一个子函数终止”。这意味着你只能等待最快的孩子退出,尽管你可能有很多。