C 通过克隆()后的指针访问父级中的变量

C 通过克隆()后的指针访问父级中的变量,c,clone,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**

很抱歉我可能会问一个愚蠢的问题,但我是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 从一次跑步改为另一次跑步

希望你能帮助我:)

  • 子栈
    已经是指向有效内存的指针,所以不要传递它的地址,而是传递它的值
  • 堆栈自上而下地增长,至少在几乎所有Linux实现上是如此,因此传递的堆栈指针需要是为堆栈分配的内存的末尾

在C语言中,也不需要强制转换为
(void*)


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

clone
是非常低级的。是否有理由不使用pthreads或类似工具?您不需要也不应该强制转换
malloc
的返回值。检查我必须使用克隆,它在任务中。pthreads会容易得多:)@user3077638:不客气。如果你认为这回答了你的问题,你可能会这样做。如果你也喜欢它,你也可以自由地投票给这个答案。
cpid = clone(child_starter, ((char *) child_stack) + 65536, CLONE_VM , package);