【问题标题】:How can i pass pointer of function from std::function to Linux clone?如何将函数指针从 std::function 传递给 Linux 克隆?
【发布时间】:2020-04-28 20:26:33
【问题描述】:

我有一个如下所示的课程:

class MyThread{
private:
    pid_t pid;
    size_t stack_size;
    char* child_stack;
    void* child_stack_end; 

public:

// --methods--

    MyThread(std::function<int(void*)> const& fun) {
        stack_size = 1024*10;
        child_stack = new char[stack_size];
        child_stack_end = child_stack + stack_size;

        int (*const* ptr)(void*) = fun.target<int(*)(void*)>();

        pid = clone(*ptr, child_stack_end, CLONE_VM | 
        CLONE_FS | CLONE_FILES | CLONE_SIGHAND | SIGCHLD, 0);
    }
}

我想用我的合并排序函数和 lambda 来测试它(不是创建 MyThread 类的构造函数,巫婆将 merge_sort_thread 函数的参数 + clone() 需要 int(*)(void*) 函数作为 1 个参数):

MyThread([first, center](void* arg){
    return merge_sort_thread(first, center);
});

然后我尝试这段代码,它返回 SIGSEGV。 我检查了 GDB,变量 ptr 等于 0x0。 我该如何解决这个问题?

合并排序函数如下:

template<typename T>
static int merge_sort_thread(T first, T last){ // working with pointers 
   //sorting
}

主要思想是使用 MyThread 类,如 std::thread 和 lambda

std::thread([first, center](){
    return merge_sort_thread(first, center);
});

【问题讨论】:

    标签: c++ linux c++11 lambda std-function


    【解决方案1】:

    简单地说,你不能。捕获 lambda 与函数指针不兼容,因此您对 fun.target&lt;int(*)(void*)&gt; 的调用会返回一个空指针。将其传递给clone 会导致段错误。

    这就是为什么clone 有一个void* args 参数来将一个(指向)任意数据的(指针)传递给回调函数:这有效地完成了捕获的作用。如果您想将自定义 std::function 传递给 clone,您需要将其包装到带有签名 int(void*) 的函数中,该函数在内部将 std::function 从其 void* 参数中解包并调用它。

    【讨论】:

      猜你喜欢
      • 2014-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多