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

时间:2012-11-21 02:28:19

标签: c++ linux signals fork execvp

我正在实施家庭作业终端 我几乎完成了,我只需要实现一个bg(背景)和一个fg(前景)命令 我的代码看起来像这样:

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)停止前台进程(子进程),然后到将控件从它停止的点(waitpid)返回给父亲(我的终端)。

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

如果我在信号处理方法中调用run()它会起作用,但我不想要递归。我猜我很快就会得到一个StackOverFlow ......

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

void sigtstp_handel( int signal ){  

    if( is_foreground_process_alive() )
        kill( foreground_process_pid, SIGTSTP );

    // run();
}  
编辑:我不知道它是否重要,但我使用的是Linux Ubuntu 12.10。然而,对于家庭作业,我需要它在其他系统上工作。

谢谢!

1 个答案:

答案 0 :(得分:2)

阅读waitpid的官方POSIX参考:

  

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调用应在其等待的进程停止时返回。