2012-03-24 236 views
0

我需要克隆()系统调用一些帮助。 我想使用它与标志CLONE_CHILD_CLEARTID,但我不能看到我指定为参数的字段的值的任何更改。 这是一个简单的代码:克隆和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,什么是我做错了什么?

回答

0

您正在通过价值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系统调用:从我们的意见的讨论添加,child_stack可以是零为sys_clone系统调用而不是库函数clone()

+0

我编辑了代码并在'clone'中使用了'&child_id',但没有任何变化:( – Federico 2012-03-24 14:09:30

+0

我的不好。接缝,我不能'NULL'值为子堆栈 – Federico 2012-03-24 14:33:13

+0

@Federico其实对于'sys_clone'系统调用,其中最重要的是实现了库函数'clone','child_stack'可以为零。当你使用库函数时,可能不会。当你为孩子提供适当的栈后,'tid清除功能? – 2012-03-24 15:49:18

0

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