我使用ftok/shmget/shmat/shmdt函数在Linux上创建、写入和读取共享段。如果我在一个程序中写入数据到该段,然后退出该程序,随后在另一个程序中读取该段时,我会惊讶地发现数据仍然存在。
我本来期望当最后一个共享该段的进程执行shmdt时,该段将被释放。我能否依赖这种行为?还是类似于在free()之后继续使用指针的情况?
我本来期望当最后一个共享该段的进程执行shmdt时,该段将被释放。我能否依赖这种行为?还是类似于在free()之后继续使用指针的情况?
shmctl(shmid, IPC_RMID,...)
[或系统重启]进行删除。这将在每个进程执行了shmdt
[或终止]后生效。shmat
类似于open
。shmdt
类似于close
,而上述的shmctl
则像unlink
。shmdt
只是分离内存,不会在数据段上执行擦除/覆盖操作。直到其他进程再次映射和使用它,数据才会保留。
此外,您应该使用更新的、符合 POSIX 标准的 mmap
。