你如何在类和命名空间中的linux中克隆()?

时间:2011-02-09 20:57:31

标签: c++ c namespaces clone linuxthreads

我正在介绍操作系统课程,我们将在linux中使用clone()调用来创建线程,然后用它们做一些事情。我似乎在使用clone()时遇到了麻烦。

我已将我的代码组织成一个类(称为 Homework ),该类位于类的名称空间中( Course )。这可能是问题,因为这是我第一次真正使用namespace关键字。我正在尝试使用我很少做的事情来变得更有经验,所以如果我有一个愚蠢的错误,那就这样吧。

我在网上发现了一些文章,但是没有多大帮助。我已经阅读了手册页,但我想我没有足够的经验来理解问题所在。一天!感谢您的任何帮助:)

我希望有方法来捕获类中的克隆:

// -- Header -- //  
namespace _Course_ {  
    class _Homework_ {  
               ...  
        int threadCatch(void *);  
               ...  
   };  
}

// -- Source -- //  
namespace _Course_ {   
  void _Homework_::threadTest(void) {  
             ...  
     // From web article  
     void **childStack;  
     childStack = ( void **) malloc(KILOBYTE);  
     clone(threadCatch, childStack, CLONE_VM | CLONE_FILES, NULL);  
             ...  
  }  

  int _Homework_::threadCatch(void * ){  
    cout << getpid() << " cloned." << endl;    
    exit(0);  
  }
}

我现在拥有的是什么。我尝试了不同的方法(将捕获器从类中取出,然后命名空间)。它编译了两次,但是当我尝试在make clean之后重新编译它告诉我函数(threadCreate)在多个位置声明。由于这些奇怪的错误,我确信我做错了什么,而不是黑客,我会采取一些意见。我该怎么做,或接下来应该阅读什么?谢谢!

2 个答案:

答案 0 :(得分:1)

将catch函数定义为静态类函数。

static int threadCatch(void *);

另外(你可能不需要这个,但以防万一,我会在这里说)你可能还需要使用范围解析运算符将它发送到clone()。我不这么认为,因为你已经在家庭作业课中使用它了。但我说的是以防万一,它可能对你有所帮助。

clone(Homework::threadCatch, childStack, CLONE_VM | CLONE_FILES, NULL);

答案 1 :(得分:1)

clone(2)系统调用需要一个指向C linkage函数的指针。由于您使用的是C ++,我建议您将threadCatch()函数移动到全局命名空间中,并将其声明为extern "C"函数。您也可以将类中的方法声明为static,但我觉得将它作为一个自由函数与C链接更紧密地匹配函数作为参数传递的方式。

如果需要调用threadCatch()函数内部存在于其范围之外的C ++对象,则可以将指针作为arg调用的clone()参数传递给这些对象。然后,您的threadCatch()函数会将arg强制转换为适当的类型,以便您可以相应地访问C ++对象。