clone和CLONE_CHILD_CLEARTID标志

时间:2012-03-24 13:00:30

标签: c linux clone system-calls

我需要一些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时,我做错了什么?

2 个答案:

答案 0 :(得分:1)

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

This is where tid的清除发生在内核

/*
 * 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他们通过clone跟踪strace系统调用的参数

编辑:从我们在评论中的讨论中添加child_stack系统调用sys_clone可以为零,但库函数clone()

答案 1 :(得分:0)

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