Process 的封装会产生意想不到的行为
Encapsulation of Process creates unexpected behavior
我的作业要求我封装进程处理的原理。
这是我的进程 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()
正常(没有封装)时,它就像一个魅力。
我哪里错了?我如何同步子项和父项以确保他们都完成工作?
我无法验证您的示例,但我发现您的 class 过程中存在明显缺陷。它定义了自定义构造函数和析构函数,但未定义赋值运算符,这违反了 rule of three.
考虑以下代码:
void example()
{
Process pro;
{
Process pro2 = pro;
}
// here pro.pid_ will have id of the already killed 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()
正常(没有封装)时,它就像一个魅力。
我哪里错了?我如何同步子项和父项以确保他们都完成工作?
我无法验证您的示例,但我发现您的 class 过程中存在明显缺陷。它定义了自定义构造函数和析构函数,但未定义赋值运算符,这违反了 rule of three.
考虑以下代码:
void example()
{
Process pro;
{
Process pro2 = pro;
}
// here pro.pid_ will have id of the already killed process
}