【发布时间】:2026-01-23 03:10:01
【问题描述】:
家长:
shm_id = shmget(IPC_PRIVATE, (1 << 16), IPC_CREAT | IPC_EXCL | 0777);
setenv("SOME_ENV_VAR",stringof(shm_id);
if(fork()=0){
execve(some_path,argv);
}
孩子:
int shm_id = atoi(getenv("SOME_ENV_VAR"));
int *shared_mem = (int*)shmat(shm_id,0,NULL);
if(!shared_mem)
return;
shared_mem[0]++;
我想编辑孩子的共享内存。为什么这不起作用的任何原因?我在 Parent.Im 中通过 shmget 分配共享 mem 块。我将 shm_id 作为 env 变量让孩子在 fork 和 exec 之后读取它。
在孩子中,我正在读取正确的 shm_id,然后尝试通过 shmat 获取指向共享内存的指针。在我的代码中,我已经验证了 Parent 和 Child 中的 shm_id 是相同的......有什么想法吗?
【问题讨论】:
-
我在两个代码示例的每一行都看到至少一个错误,但代码的基本轮廓是正确的,除了您需要在父级和孩子(在
fork之后执行此操作)。如果您需要更多帮助,请向我们提供完整的程序,我们可以自己编译和运行,并详细告诉我们您在运行它们时实际发生了什么,以及这与您的预期有何不同。 -
注:新程序应使用
shm_open和朋友而不是shmget和朋友。 -
shmat() 调用应该是 shmat(shm_id, NULL, 0)。
-
@gblaster,你完成这个任务了吗?请告诉我,除了函数调用参数混乱之外,您还有什么问题。谢谢
标签: c linux fork system-calls shared-memory