【问题标题】:clone and the CLONE_CHILD_CLEARTID flag克隆和 CLONE_CHILD_CLEARTID 标志
【发布时间】:2012-04-08 18:24:30
【问题描述】:

我需要一些有关 clone() 系统调用的帮助。 我正在尝试将它与标志 CLONE_CHILD_CLEARTID 一起使用,但我看不到我指定为参数的字段的值有任何变化。 这是一个简单的代码:

int the_child(){
   exit(0);
}
int main(int argc, char * argv[])
{
    pid_t child_id = 99;
    printf("child %p\n",child_id);

    clone((int (*)(void *))the_child,
          NULL,
          CLONE_VM | CLONE_CHILD_CLEARTID | SIGCHLD,
          NULL, NULL,NULL, child_id);

    sleep(1);
    printf("child %p\n",child_id);
 }

但是当两个printf显示总是99时,我做错了什么?

【问题讨论】:

    标签: c linux clone system-calls


    【解决方案1】:

    您正在通过值传递child_id。您应该将其作为指针传递。

    This is wheretid 的清除发生在内核内部

    /*
     * We don't check the error code - if userspace has
     * not set up a proper pointer then tough luck.
     */
    put_user(0, tsk->clear_child_tid); 
    

    你能看到相同的评论警告吗? :)

    See this blog 通过strace 跟踪clone 系统调用的参数

    编辑:根据我们在 cmets 中的讨论,child_stack 对于 sys_clone 系统调用可以为零,但对于库函数 clone() 则不能为零

    【讨论】:

    • 我编辑了代码并在clone 中使用了&child_id,但没有任何改变:(
    • 我的错。接缝我不能NULL 子堆栈的值。
    • @Federico 其实对于sys_clone的系统调用,上面实现了库函数clonechild_stack可以为零。当您使用库函数时可能不是。在您为孩子提供适当的堆栈后,tid 清除功能发生了什么?
    【解决方案2】:

    您不应该在创建克隆之前分配内存 (malloc()) 吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-11
      • 1970-01-01
      • 2013-04-28
      相关资源
      最近更新 更多