【发布时间】:2011-12-30 01:45:59
【问题描述】:
我目前正在用 C++ 编写一个小 shell。
作业和与之关联的 PID 存储在作业指针队列(job *) 中。运行新作业时,有关它的信息将添加到队列中。由于可以同时处理多个作业,并且可以随时在 shell 的控制台输入新作业,因此我有一个信号处理程序来等待终止的作业。
当作业终止时,我需要从活动作业队列中删除它的信息并将其移动到我的已终止作业的双端队列中。但是,当另一个作业停止时,可能会将用户的新作业添加到队列中。
在这种情况下,他们的insert 队列操作将被暂停,我的信号处理程序将被调用,这将执行它的pop 操作。
我正在尝试了解如何解决这种潜在的竞争条件,因为我认为在此过程中可能会发生损坏。我不能使用互斥锁,因为如果被中断的父进程当时正在使用队列,则会发生死锁。
我看到一些关于C++11 能够执行用户声明的原子操作的信息,以及有关小任务的信息。我不确定这些是否与我的问题有关。
有趣的是,我用作参考的示例 shell (MSH - http://code.google.com/p/mini-shell-msh/) 似乎没有对此类情况进行任何处理。信号处理程序与主控制台一起立即修改作业列表。也许我在这里忽略了什么?
与往常一样,所有反馈都会得到认可。
【问题讨论】:
-
可以在修改时禁用中断吗?使插入原子化?
-
a)
STL::Queue到底是什么? b) 要非常小心你在信号处理程序中所做的事情。我认为如果您修改除sigatomic_t变量之外的任何内容,您的行为未定义。 -
@chustar,大多数多处理器系统不允许禁用中断。由于我不知道目标环境,所以我不能这样做。我想一定有更好的方法。
-
@KerrekSB,我指的是“STL”库中提供的队列库,我猜它实际上是 std 库。 cplusplus.com/reference/stl/queue 将其称为 STL 容器..
-
@BSchlinker:还有what did we learn about cplusplus? :-)
标签: c++ shell exec race-condition signal-handling