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**)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 从运行到运行的变化..

希望你能帮助我:)

最佳答案

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


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

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

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

关于c - 在 clone() 之后通过指针访问父级中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20442072/

相关文章:

java - 结合克隆和引用的优势?

ruby - 在 Ruby 中对克隆的散列使用 gsub 会修改原始散列

C 编程 - 表达式?

c - 使用atoi检查字符串

c - 将数字字符串汇编成 int

c - 数组的元素是否保证从低地址到高地址存储?

javascript - 添加/删除按钮不适用于重复的表单字段 - jquery

git - 我应该在 node_modules 中克隆一个 Node 库来修改它吗?

c - C 中的胖指针

clone - 为 https 访问配置 gitlab 项目