我正在为家庭工作实施终端。
我几乎完成了,我只需要实现一个 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。尽管如此,对于家庭作业,我需要它在其他系统上工作。
谢谢!