0

我正在介绍操作系统课程,我们将使用 linux 中的 clone() 调用来创建线程,然后用它们做一些事情。我似乎根本无法使用 clone() 。

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

我在网上找到了一些文章,但它们并没有太大帮助。我已经阅读了手册页,但我想我没有足够的经验来理解问题所在。一天!感谢您的帮助:)

我想有方法来捕捉类中的克隆:

// -- 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)在多个位置声明。由于这些奇怪的错误,我确定我做错了什么,而不是破解它,我会采取一些意见。我应该做什么,或者我接下来应该读什么?谢谢!

4

2 回答 2

1

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

static int threadCatch(void *);

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

clone(Homework::threadCatch, childStack, CLONE_VM | CLONE_FILES, NULL);
于 2011-02-09T21:19:18.687 回答
1

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

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

于 2011-02-09T21:26:32.943 回答