2

我正在为家庭工作实施终端。
我几乎完成了,我只需要实现一个 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)停止前台进程(子进程),然后将控制权返回给父亲(我的终端)从它停止的点(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。尽管如此,对于家庭作业,我需要它在其他系统上工作。

谢谢!

4

1 回答 1

2

阅读官方 POSIX 参考waitpid

未追踪

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

于 2012-11-21T02:39:40.257 回答