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