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

标签 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);
}

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

最佳答案

shmgetkey_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/

相关文章:

linux - 在 .CSV 之前从 Linux 中的文件名中删除日期并附加

C++,如何在进程或线程之间共享数据

haskell - 如何在 Haskell 中实现 fork try-catch?

c - Linux Fork 进程终止

python - 使用 Pythons ctypes 从 libc 调用 uname

c - 我在C程序中遇到冲突类型错误

c - 我应该在 C 中声明系统调用函数吗?

c++ - OpenCV : 中缺少三角测量库

c - 在 Linux 中处理 SIGBUS

c - 如何在 C 中将 2 字节整数转换并分解为 2 个不同的字符?