C 确定“是否”的逻辑;“提示”;应该打印出来

C 确定“是否”的逻辑;“提示”;应该打印出来,c,shell,fork,background-process,C,Shell,Fork,Background Process,这似乎是一个基本的想法:我想打印出一个用C制作的迷你shell的提示。下面是一个例子,说明我对提示的意思: if(isBackground == 0) prompt(); $ls $作为“提示”。我正在制作的这个小型shell支持通过正常的bash表示法将一个&符号放在一行的末尾,将一个过程作为背景。比如$ls& 我目前的逻辑是,在我的主命令循环中,如果进程不需要后台处理,则打印出提示: if(isBackground == 0) prompt(); 然后在我的信号处理程序中

这似乎是一个基本的想法:我想打印出一个用C制作的迷你shell的提示。下面是一个例子,说明我对提示的意思:

if(isBackground == 0)
    prompt();
$ls

$
作为“提示”。我正在制作的这个小型shell支持通过正常的bash表示法将一个
&
符号放在一行的末尾,将一个过程作为背景。比如
$ls&

我目前的逻辑是,在我的主命令循环中,如果进程不需要后台处理,则打印出提示:

if(isBackground == 0)
    prompt();
然后在我的信号处理程序中,我使用
write()
打印出提示,这涵盖了它是后台进程的情况

如果后台命令立即返回,如快速返回
$ls&
,则此操作正常,但在类似
$sleep 10&
的情况下,shell看起来像是被阻止了,因为提示在到达信号处理程序之前不会被打印出来

我不知道如何解决这个问题,因为我不知道后台进程何时结束,这意味着信号处理程序需要告诉我们何时打印新的提示,因为如果后台进程碰巧有一个输出,它就会输出,然后就不再有提示了


我如何解决这个问题?有没有更好的方法可以解决我的问题,但我没有想到

你是如何运行这个过程的?如果没有背景,请等待它,然后再继续REPL,如果没有,请继续。您不必检查它是否是背景的。@muru如果它不是背景的,则会发生一个正常的
fork
,其中子项将通过
execvp
替换并运行,父项将
waitpid
完成。这个很好用,与背景无关。然而,当背景接地时,我使用的是带有信号处理程序的
信号。这就是提示的问题所在。哦,我看到您正在使用信号处理程序来编写提示。我觉得你的设计有点奇怪。信号处理程序可能应该设置一个标志或一些主循环可以检查的东西。我不明白为什么它会干扰提示符(其他信息,是;提示符,否)。@muru但是如果设置了一个标志,主程序什么时候会检查它?输入的每个命令都会执行一个循环。如果后台进程在等待用户命令的中间终止,那么后台进程STDUT将被输出,并且不再有提示,因为它已经被预先输出,以便等待下一个命令,而另一个进程在后台运行。我希望这能解决问题?不是真的。这就是我常用的shell上发生的情况:bash、zsh、dash。后台程序的输出独立于主shell中发生的事情。所以,如果打印了一个提示,它就会淹没在输出中。