exec后两个进程之间的共享内存

时间:2018-01-27 21:11:04

标签: c linux fork system-calls shared-memory

父:

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是一样的......有什么想法吗?

2 个答案:

答案 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