更新:
我忘记了一个明显的调试步骤。如果我尝试像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 ++。