流程处理的封装会产生问题
Encapsulation of process handling creates problems
我的作业要求我封装进程处理的原理。
这是我的 Process
class 包含的内容:
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()
正常(没有封装)时,它就像一个魅力。
我哪里错了?
这听起来像 race condition。在您的情况下,parent 大多数时候似乎会在 child 执行您期望的操作之前将其杀死。如果两个进程之间没有同步,任何执行顺序都是可能的。如果您希望 child 始终执行工作,则必须实施某种形式的同步。一个常见的 hack(即不是真正的同步)是 [sleep][2]()
ing in the parent。很常见的是 [wait][2]()
在 parent 中完成 child。
我的作业要求我封装进程处理的原理。
这是我的 Process
class 包含的内容:
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()
正常(没有封装)时,它就像一个魅力。
我哪里错了?
这听起来像 race condition。在您的情况下,parent 大多数时候似乎会在 child 执行您期望的操作之前将其杀死。如果两个进程之间没有同步,任何执行顺序都是可能的。如果您希望 child 始终执行工作,则必须实施某种形式的同步。一个常见的 hack(即不是真正的同步)是 [sleep][2]()
ing in the parent。很常见的是 [wait][2]()
在 parent 中完成 child。