基于前一个任务的sigchld()执行新任务
Executing new task based on sigchld() from previous task
我目前正在用c++构建一个小shell。
用户可以在提示符下输入作业,例如exe1 && exe2 &
。与BASH shell类似,如果exe1
成功退出,我将只执行exe2
。此外,整个作业必须在后台执行(由后面的&
操作符指定)。
现在,我有一个jobManager
处理作业的执行,job
结构包含作业的可执行文件和它们各自的参数/条件。作业通过调用fork()
,然后使用适当的参数调用execvp()
来启动。当一个作业结束时,我有一个SIGCHLD
的信号处理程序,我在其中执行wait()
来确定哪个进程刚刚结束。当exe1
结束时,我观察它的退出代码,并决定是否应该继续启动exe2
。
我关心的是如何启动exe2
。我担心,如果我从SIGCHLD
处理程序的上下文中使用jobManager start函数,我最终可能会在堆栈上挂起太多的SIGCHLD
处理程序函数(例如,如果有10个条件执行)。此外,从信号处理程序开始下一个执行似乎不是一个好主意,即使它是间接发生的。(我在1.5年前尝试过类似的事情,当时我刚刚学习信号处理——我似乎记得它在我身上失败了)。
以上所有需要能够在后台发生,我想避免让jobManager
坐在繁忙的等待中,只是等待exe1
返回。我也不希望有一个单独的线程等待另一个进程的开始执行。然而,指示我的jobManager
从SIGCHLD
处理程序开始执行下一个进程似乎是糟糕的代码。
我认为有两种方法:
1)用调用"sigwait"的循环替换你的sighandler(参见man 3 sigwait)
然后in loop
2)在开始创建管道之前,在程序的主循环中使用"select"在管道句柄上等待事件。
嗯,这个不错。
如果每个进程分叉两次呢?第一个跑了,第二个停了。在父SIGCHLD处理程序中,如果合适的话,将SIGCONT发送给第二个子处理程序,然后该子处理程序启动并运行作业。自然地,如果第一个不应该运行,您可以SIGKILL第二个,这应该是安全的,因为您实际上没有设置任何内容。
听起来怎么样?您将有一个进程无所事事,但它不应该持续很长时间。
- 如何创建线程序列以按照启动顺序执行任务?
- 编写一个读取五个整数并执行一些任务的C++程序
- 使用哪种模式来执行新代码,只需添加基类的新子类?
- 在iOS设备上执行并发任务时如何设置正确的线程数?
- 如何为基类构造函数中的每个子类执行特定任务
- 正在执行 omp 任务的线程数
- 新任务中以前的数据会发生什么变化
- 在执行后台任务时与Objective-C中的GUI交互
- 执行并行任务,无需等待C++结果
- C++放置新任务与复制任务
- 如何仅在使用 c++ 中的 boost 完成所有任务时才向线程池添加新任务
- 我应该使用哪种STL来执行此任务
- 在线程在 C++ 中完成后将新任务分配给线程
- 对如何在 C++ AMP 上执行大任务一无所知
- 在C++中执行单个任务的多线程
- 从c++启动一个c#应用程序,并在该应用程序上执行一个任务
- 基于前一个任务的sigchld()执行新任务
- UWP/WinRT:如何在模型中的异步操作完成后执行UI任务
- 任务调度程序:如何调度登录时执行的任务
- 如何使C或c++程序每X秒执行一次特定的任务,但其间仍执行其他任务