C ++,linux,fork,execvp,waitpid和SIGTSP

我正在实施一个家庭工作terminal。
我差不多完成了,我只需要实现一个bg(Background)和一个fg(Foreground)命令。
我的代码如下所示:

void run(){ string command[] = parseMyInput( getInput() ); int fork_result = fork(); if( -1 == fork_result ) //handle error else if( 0 == fork_result ){ // child setpgrp(); // I don't want the children to get the signals if( -1 == execvp( command[0], makeArgs(command) ) ) //handle error } else { // parent if( command[ length - 1 ] != "&" ){ int status; waitpid( fork_result, &status, 0 ); //continue after child is finished //( need to be here also after a SIGTSTP is raised by ctrl+z ) } } 

如果是前台进程(如果末尾没有'&'符号),那么我需要用ctrl + z(SIGTSTP)来停止前台进程(subprocess),然后返回到父亲(我的terminal)从它停止的地方(waitpid)。

问题是在ctrl + z被按下之后(在父信号处理方法中获得控件并使用kill(child_pid,SIGTSTP)停止子控件)之后,父控件不会从停止的地方继续(waitpid )。 信号处理方法完成后,我不知道它在哪里继续。

如果我在信号处理方法中调用run(),它将工作,但我不想recursion。 我猜我会很快得到一个StackOverFlow …

这里是信号处理方法的代码:

 void sigtstp_handel( int signal ){ if( is_foreground_process_alive() ) kill( foreground_process_pid, SIGTSTP ); // run(); } 

编辑:我不知道是否重要,但我使用Linux的Ubuntu 12.10。 不过,对于家庭作业,我需要它在其他系统上工作。

谢谢!

Solutions Collecting From Web of "C ++,linux,fork,execvp,waitpid和SIGTSP"

阅读官方的POSIX参考waitpid

WUNTRACED

 The status of any child processes specified by pid that are stopped, and whose status has not yet been reported since they stopped, shall also be reported to the requesting process. 

所以如果添加WUNTRACED标志, waitpid调用应该在它等待的进程停止时返回。