父:
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分配共享内存块,将shm_id作为env变量,让孩子在fork和exec之后读取它。
在孩子中,我正在阅读正确的shm_id,然后尝试通过shmat获取指向共享内存的指针。在我的代码中,我已经验证了父和子中的shm_id是一样的......有什么想法吗?
答案 0 :(得分:1)
key_t
的{{1}}参数与该函数返回的标识符不同。用一个替换另一个是不明智的。
但是,如果您更改并传达 shmid 而不是键,则您的基本方法将有效。
shmid 是系统范围的全局标识符,如果您具有相应的进程权限,shmget
将成功,即使您是一个不相关的进程。 (并且,即使您是相关的,shmat
将分离任何共享内存段,需要显式重新附加。)
请注意,规范对此并不十分明确,请说"[e]ach individual shared memory segment ... shall be identified by a unique positive integer, called ... a shared memory identifier, shmid."。
答案 1 :(得分:0)
在操作系统级别段上由键标识, ID 仅对进程本地。每个进程都需要执行 get (传递相同的密钥)和 at 以使用内存。
此处的示例:http://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/shm/shmat.html