gpt4 book ai didi

c++ - 基于上一个任务的 sigchld() 执行新任务

转载 作者:太空宇宙 更新时间:2023-11-04 12:15:04 25 4
gpt4 key购买 nike

我目前正在使用 C++ 构建一个小型 shell。

用户可以在提示符下输入作业,例如 exe1 && exe2 &。与 BASH shell 类似,如果 exe1 成功退出,我只会执行 exe2。此外,整个作业必须在后台执行(由结尾的 & 运算符指定)。

现在,我有一个处理作业执行的 jobManager 和一个包含作业的可执行文件及其各个参数/条件的 job 结构。通过调用 fork() 然后使用适当的参数调用 execvp() 来启 Action 业。当作业结束时,我有一个用于 SIGCHLD 的信号处理程序,我在其中执行 wait() 以确定哪个进程刚刚结束。当 exe1 结束时,我观察它的退出代码并决定是否应该继续启动 exe2

我关心的是如何启动 exe2。我担心如果我从我的 SIGCHLD 处理程序的上下文中使用我的 jobManager 启动函数,我最终可能会在堆栈上挂出太多的 SIGCHLD 处理函数(如果例如,有 10 次有条件执行)。此外,从信号处理程序开始下一次执行似乎不是一个好主意,即使它是间接发生的。 (我在 1.5 年前尝试过类似的事情,当时我刚刚学习信号处理——我似乎记得它对我来说失败了)。

以上所有都需要能够在后台发生,我想避免让 jobManager 忙于等待 exe1 返回。我也宁愿没有一个单独的线程等待开始执行另一个进程。但是,指示我的 jobManagerSIGCHLD 处理程序开始执行下一个进程似乎是糟糕的代码。

欢迎任何反馈。

最佳答案

我看到两种方式:
1)用调用“sigwait”的循环替换你的sighandler(参见man 3 sigwait)
然后在循环

2) 在开始创建管道之前,在程序的主循环中使用管道句柄上的“select”等待事件。在信号处理程序中写入管道,并在主循环中处理情况。

关于c++ - 基于上一个任务的 sigchld() 执行新任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8108834/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com