实施后台处理

时间:2012-01-15 06:59:08

标签: linux process

更新: 我忘记了一个明显的调试步骤。如果我尝试像ps &这样的命令会发生什么 在常规的旧bash shell中?答案是我看到了同样的行为。例如:

[ahoffer@uw1-320-21 ~/program1]$ ps &
[1] 30166
[ahoffer@uw1-320-21 ~/program1]$   PID TTY          TIME CMD
26423 pts/0    00:00:00 bash
30166 pts/0    00:00:00 ps
<no prompt!>

如果我然后按Enter键,命令shell将报告退出状态,控制台将显示退出状态和提示:

[ahoffer@uw1-320-21 ~/program1]$ ps&
[1] 30166
[ahoffer@uw1-320-21 ~/program1]$   PID TTY          TIME CMD
26423 pts/0    00:00:00 bash
30166 pts/0    00:00:00 ps

[1]    Done                          ps
[ahoffer@uw1-320-21 ~/program1]$

PS:我正在使用PuttY通过端口22上的SSH访问Linux机器。

<小时/> 原始问题: 我正在做家庭作业。任务是使用fork(),exec()等函数在Linux上实现命令shell解释器的一部分。当我的代码作为后台进程执行命令时,我发生了一个奇怪的错误。

例如,在下面的代码中,命令ls正确执行ls并将其输出打印到控制台。命令完成后,调用代码中的事件循环正确地将提示“%”打印到控制台。

但是,执行ls &时,ls正确执行,其输出将打印到控制台。但是,提示“%”永远不会打印出来!

代码很简单。这是伪代码的样子:

int child_pid;

if ( (child_pid=fork()) == 0 )  {

   //child process
   ...execute the command...
}

else {

    //Parent process
    if( delim == ';' )    

        waidpid(child_pid);
}

//end of function.

如果分隔符是分号,则父进程会阻塞。否则函数结束,代码重新进入事件循环。但是,如果父项在执行后台命令时休眠,则提示正确显示:

...

//Parent process
        if( delim == ';' ) {

        waidpid(child_pid)
   }

    else if( delim == '&' ) {

        sleep(1); 
        //The prompt, " %", is correctly printed to the
        // console when the parent wakes up.
    }

班上没有人知道为什么会这样。操作系统是RedHat Enterprise 5,编译器是g ++。

0 个答案:

没有答案