【问题标题】:Encapsulation of process handling creates problems流程处理的封装会产生问题
【发布时间】:2016-04-13 13:19:08
【问题描述】:

我的作业要求我封装流程处理的原理。

这是我的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() 正常时(没有封装)它就像一个魅力。

我哪里做错了?

【问题讨论】:

    标签: c++ process fork


    【解决方案1】:

    这听起来像race condition。在你的情况下,父母大部分时间似乎在孩子做你期望的事情之前杀死了孩子。如果两个进程之间没有同步,任何执行顺序都是可能的。如果您希望孩子始终执行工作,则必须实施某种形式的同步。一个常见的 hack(即不是真正的同步)是 [sleep][2]()ing 在父级中。很常见的是在父级中[wait][2]()ing 以完成子级。

    【讨论】:

    • 有趣!但是,除了睡眠或等待会损害我的算法之外,还有其他方法可以解决这个问题吗?谢谢你的回答。
    • 同步方法还有很多,其中一种同步方式是使用通信,例如管道,文件,另一种方法是使用专门用于同步的结构,例如信号量或等待。我对您的问题了解得不够多,无法选择最好的,
    • 我肯定会使用命名管道,因为作业中提到了它。非常感谢您的帮助。
    猜你喜欢
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 2011-10-17
    相关资源
    最近更新 更多