我的任务要求我封装过程处理原则。
以下是我的Process
类包含的内容:
class Process
{
public:
Process();
~Process();
pid_t getPid() const;
private:
pid_t pid_;
};
构造
Process::Process()
{
this->pid_ = fork();
}
析构函数:
Process::~Process()
{
if (this->pid_ > 0)
kill(this->pid_, SIGKILL);
}
问题在于:在封装和创建这样的对象之后:
void example()
{
Process pro;
if (pro.pid_ == 0)
{
// Child Process
}
else if (pro.pid_ < 0)
{
// Error
}
else
{
// Parent Process
}
}
我的程序几乎从不输入子代码,但是当我fork()
正常(没有封装)时,它就像魅力一样。
我哪里出错了?
答案 0 :(得分:0)
这听起来像race condition。在你的情况下,父母大部分时间似乎在孩子完成你对孩子的期望之前杀死孩子。如果两个进程之间没有同步,则任何执行顺序都是可能的。如果您希望孩子始终执行工作,则必须实现某种形式的同步。常见的黑客(即不是真正的同步)是父母[sleep][2]()
。非常常见的是父母[wait][2]()
完成孩子。