壳执行:信号处理:任何方式从wait()返回早?

我正在为我的操作系统类做一个shell项目,我们正在做信号处理的一部分。 该任务要求我们捕获SIGINTSIGTSTP并将信号发送给subprocess。 这是我到目前为止。 如果遇到一个未定义的variables或函数,我希望你能根据标识符理解它的含义:

 char input[ MAX_INPUT ]; sigset_t sig; pid_t *suspendedChildren = NULL; int nSuspendedChildren = 0; pid_t currentChild = 0; int main( int argc, char *argv[] ) { char quit = 0; setup(); do { getInput(); quit = handleInput( input ); } while( quit != EXIT_NUMBER ); return 0; } void setup( void ) { // block the interrupt signal sigaddset( &sig, SIGINT); sigprocmask( SIG_BLOCK, &sig, NULL); // handle the suspend signal signal( SIGTSTP, suspendChild ); } void suspendChild( int signal ) { if (currentChild) // meaning that there is a child process currently running { // increment suspended children counter nSuspendedChildren++; // reallocate the array of suspended children suspendedChildren = (pid_t *)realloc( suspendedChildren, nSuspendedChildren*sizeof(pid_t)); suspendedChildren[nSuspendedChildren-1] = currentChild; // send suspend signal to child kill( currentChild, SIGTSTP ); printf( "\n[%d]+ Stopped\t\t", nSuspendedChildren ); puts( input ); putchar( '\n' ); // set the global to 0 currentChild = 0; main( 0, NULL ); } } int handleInput( char *s ) { // string tokenizing / parsing... // checks for redirection / background process requests // (not relevant to question being asked so omitted) currentChild = fork(); if (currentChild) // parent process { wait( &status ); } else // child process { execvp( prgm, tokens ); } } 

所以为了处理SIGINT ,我只是简单地阻塞信号,以便subprocess(执行的命令)在父进程(shell)忽略它的时候接收它。 这工作得很好,但是这是SIGTSTP和暂停过程,我有麻烦。 对于这个信号,我select在到达时调用一个信号处理程序。 这工作相当好,因为我相信进程的默认SIGTSTP处理行为是暂停,但由于我的shell正在等待(看wait(&status) )为subprocess返回(目前暂停),我的整个terminal留在一个僵尸状态。 我不能按Ctrl + D出来,我只需要杀死窗口并重新login…

所以要重申这篇文章的标题,是否有任何方法从信号处理程序的wait(int*)提前返回? 我查阅了文档,发现了这个声明:

如果收到信号,等待也会返回,不会被忽略。

然而,这就是说,并没有提供进一步的见解。

而不是wait是否真的waitpid (有一定的选择),你真的想要使用。 – 鸭