家长:
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);
}
child :
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 之后让 child 读取它。
在 child 中,我正在读取正确的 shm_id,然后尝试通过 shmat 获取指向共享内存的指针。在我的代码中,我已经验证了 Parent 和 Child 中的 shm_id 是相同的......有什么想法吗?
最佳答案
shmget
的key_t
参数与该函数返回的标识符不同。用一个代替另一个是不明智的。
但是,如果您更改它并传达 shmid 而不是 key,您的基本方法将起作用。
shmid 是系统范围的全局标识符,如果您具有适当的进程权限,即使您是无关进程,shmat
也会成功。 (而且,即使您是相关的,execve
也会分离任何共享内存段,需要显式重新附加。)
请注意,规范对此并没有非常明确,说 "[e]ach individual shared memory segment ... shall be identified by a unique positive integer, called ... a shared memory identifier, shmid." .
关于c - exec 后两个进程之间的共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48480605/