clone()后通过指针访问父级中的变量

时间:2013-12-07 13:45:35

标签: c clone

我很抱歉可能会问一个愚蠢的问题,但我是C的血腥初学者。 现在我的问题是,我需要在子进程中访问两个变量,在main中声明并修改它们。 听起来非常简单,但我必须使用克隆,并在将变量反馈到我的数组之后,它们完全搞砸了这个值。

int main (){
uint64_t N = 10000000;
uint64_t tally = 0;
int status;

void** child_stack = (void**)malloc(65536);
uint64_t** package = (uint64_t**)malloc(sizeof(uint64_t*)*2);
package[0] = &tally;
package[1] = &N;

pid_t cpid;
cpid = clone(child_starter, &child_stack, CLONE_VM , (void*)package);
waitpid(cpid, &status, __WCLONE);
return 0;
}

child_starter函数如下所示:

int child_starter(void* package){
printf( "Tally is in the child %" PRIu64 "\n", *((int64_t**)package)[0] );
return 0;
}

因为tally是0,我认为我的printf实际应该打印出0,但它更像是140541190785485 从一次运行变为运行..

希望你能帮助我:)。

1 个答案:

答案 0 :(得分:0)

  • child_stack已经是指向有效内存的指针,因此不要传递其地址,而是传递其值。
  • 堆栈从上到下,至少在几乎所有Linux实现上都是如此,因此传递的堆栈指针需要是为堆栈分配的内存的末尾。


cpid = clone(child_starter, ((char *) child_stack) + 65536, CLONE_VM , package); 

同样在C中,不需要转换为(void*)

此外^ 2 printf()不可重入,因此在这里使用容易出错。