我目前正在C++中构建一个小外壳的过程。根据以前任务的sigchld()执行新任务
用户可以在提示处输入作业,如exe1 && exe2 &
。与BASH shell类似,如果exe1
成功退出,我将只执行exe2
。此外,整个作业必须在后台执行(由操作员尾随的&
指定)。
现在,我有一个处理作业执行的jobManager
和一个包含作业可执行文件及其各个参数/条件的job
结构。通过调用fork()
,然后使用正确的参数调用execvp()
开始作业。当作业结束时,我有一个SIGCHLD
的信号处理程序,其中我执行wait()
来确定哪个进程刚刚结束。当exe1
结束时,我观察其退出代码并确定是否应继续启动exe2
。
我的担心是如何启动exe2
。我担心如果从我的SIGCHLD
处理程序的上下文中使用我的jobManager启动函数,则可能会有太多的处理函数挂在堆栈上(例如,如果有10个条件执行)。另外,从信号处理程序开始下一次执行似乎不是一个好主意,即使它是间接发生的。 (当我刚刚学习信号处理时,我试着做类似于1.5年前的事情 - 我似乎记得它对我没有帮助)。
以上所有需要能够在后台进行,我想避免让jobManager
坐在等待exe1
的繁忙等待中返回。我还希望没有一个单独的线程,只是等待开始执行另一个进程。但是,指示我的jobManager
从SIGCHLD
处理程序开始执行下一个进程看起来很糟糕的代码。
任何反馈appriciated。
啊 - 你的select()方法对我来说很有意思。我在套接字编程中使用了select()/ poll(),并且希望在这里做类似的事情以避免忙碌的等待。但是,我猜管道需要'全局',因为我无法在运行时向信号处理程序提供任何信息。 – BSchlinker
sigwait循环很丑,在这里做得不好,因为它们需要做后台工作。 – Robert
你可以处理这个没有全局变量,但在linux特定的方式:signalfd为你创建描述符来获取有关信号的信息。 – fghj