我目前正在用 C++ 构建一个小 shell。
用户可以在提示符处输入作业,例如exe1 && exe2 &
。与 BASH shell 类似,我只会exe2
在exe1
成功退出时执行。此外,整个作业必须在后台执行(由尾随&
操作员指定)。
现在,我有一个jobManager
处理作业执行的job
结构和一个包含作业的可执行文件及其各个参数/条件的结构。通过调用开始作业fork()
,然后execvp()
使用适当的参数调用。当作业结束时,我有一个信号处理程序,SIGCHLD
我在其中执行wait()
以确定哪个进程刚刚结束。结束时exe1
,我观察它的退出代码并确定我是否应该继续启动exe2
。
我关心的是如何启动exe2
. 我担心如果我从处理程序的上下文中使用我的 jobManager 启动函数SIGCHLD
,我最终可能会在堆栈上挂出太多的SIGCHLD
处理程序函数(例如,如果有 10 个条件执行)。此外,从信号处理程序开始下一次执行似乎不是一个好主意,即使它是间接发生的。(1.5 年前,当我刚刚学习信号处理时,我尝试做类似的事情——我似乎记得它对我失败了)。
以上所有内容都需要能够在后台发生,我想避免jobManager
坐在忙碌的等待中等待exe1
返回。我也希望不要有一个单独的线程只是等待开始执行另一个进程。但是,指示我jobManager
从处理程序开始执行下一个进程SIGCHLD
似乎是糟糕的代码。
任何反馈都会被应用。