。作者进程成功地使用
shmget()
创建了共享内存。当作者进程结束时,我注意到共享内存段消失了,即使我不用来删除它。
在这里是作者的代码:shmctl()
读者的代码是:
IPC_RMID
当我经营作者时,我可以使用
// writer.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>
#define SHM_KEY 0x1234
#define SHM_SIZE sizeof(int)
int main() {
int shmid = shmget(SHM_KEY, SHM_SIZE, IPC_CREAT | 0666);
if (shmid == -1) {
perror("shmget failed");
exit(1);
}
int *shm_ptr = (int *)shmat(shmid, NULL, 0);
if (shm_ptr == (void *)-1) {
perror("shmat failed");
exit(1);
}
*shm_ptr = 42;
printf("Writer: wrote %d to shared memory.\n", *shm_ptr);
// Keeping writer alive
printf("Writer: sleeping for 30 seconds...\n");
sleep(30);
shmdt(shm_ptr);
return 0;
}
看到共享存储器。但是,在作者完成和退出后,共享内存段消失了,我无法与读者访问。
可能导致这种行为?是否存在可能导致共享内存自动删除的系统设置? 此程序在macos
上正确地工作了,在作者退出后,共享内存持续存在。但是,它在
linux上:共享内存段一旦作者的过程结束就会消失,我无法与阅读器访问。 我使用ubuntu linux 5.15.0-127总生 感谢您的关注,我将感谢您对此主题的任何其他见解!
我是这个问题的OP。谢谢大家的关注!
我只是找出了这种意外行为背后的原因。它似乎与Linux内核配置有关 - // reader.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define SHM_KEY 0x1234
#define SHM_SIZE sizeof(int)
int main() {
int shmid = shmget(SHM_KEY, SHM_SIZE, 0666);
if (shmid == -1) {
perror("shmget failed");
exit(1);
}
int *shm_ptr = (int *)shmat(shmid, NULL, 0);
if (shm_ptr == (void *)-1) {
perror("shmat failed");
exit(1);
}
printf("Reader: read %d from shared memory.\n", *shm_ptr);
shmdt(shm_ptr);
return 0;
}
。当我使用以下命令更改它时:
ipcs -m