调用 shmdt() 后无法删除共享内存段
shared memory segment can't be removed after call shmdt()
我成功调用了 shmdt(),但是无法删除共享内存段..
这是我的代码:
#include <sys/types.h>
#include <sys/shm.h>
#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
key_t key = ftok(".", 'T');
if (key == -1) {
fprintf(stderr, "get key failed, error: %s\n", strerror(errno));
exit(1);
}
int shmid = shmget(key, sizeof(int) * 10, IPC_CREAT);
if (shmid == -1) {
fprintf(stderr, "get shmid failed, error: %s\n", strerror(errno));
exit(1);
}
void* shmaddr = shmat(shmid, NULL, 0);
if (shmaddr == (void*)-1) {
fprintf(stderr, "get shmaddr failed, error: %s\n", strerror(errno));
exit(1);
}
if (shmdt(shmaddr) == -1) {
fprintf(stderr, "detach failed, error: %s\n", strerror(errno));
exit(1);
}
return 0;
}
之后,我执行ipcs -m
# ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 1179648 root 0 4 0
0x00000000 1212417 root 0 4 0
0x00000000 1245186 root 0 4 0
0x00000000 1277955 root 0 4 0
0x00000000 1310724 root 0 4 0
0x00000000 1343493 root 0 4 0
0x00000000 1376262 root 0 4 0
0x00000000 1409031 root 0 4 0
0x00000000 1441800 root 0 4 0
0x00000000 1474569 root 0 4 0
0x54010004 1671178 root 0 40 0
0x00000000 1540107 root 0 4 0
shmdt() detaches the shared memory segment located at the address
specified by shmaddr from the address space of the calling process.
The to-be-detached segment must be currently attached with shmaddr
equal to the value returned by the attaching shmat() call.
shmdt 仅从附加内存中分离 调用进程。它将不会 删除进程创建的共享内存。
有关详细信息,请阅读相应系统调用的手册页。
我成功调用了 shmdt(),但是无法删除共享内存段..
这是我的代码:
#include <sys/types.h>
#include <sys/shm.h>
#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
key_t key = ftok(".", 'T');
if (key == -1) {
fprintf(stderr, "get key failed, error: %s\n", strerror(errno));
exit(1);
}
int shmid = shmget(key, sizeof(int) * 10, IPC_CREAT);
if (shmid == -1) {
fprintf(stderr, "get shmid failed, error: %s\n", strerror(errno));
exit(1);
}
void* shmaddr = shmat(shmid, NULL, 0);
if (shmaddr == (void*)-1) {
fprintf(stderr, "get shmaddr failed, error: %s\n", strerror(errno));
exit(1);
}
if (shmdt(shmaddr) == -1) {
fprintf(stderr, "detach failed, error: %s\n", strerror(errno));
exit(1);
}
return 0;
}
之后,我执行ipcs -m
# ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 1179648 root 0 4 0
0x00000000 1212417 root 0 4 0
0x00000000 1245186 root 0 4 0
0x00000000 1277955 root 0 4 0
0x00000000 1310724 root 0 4 0
0x00000000 1343493 root 0 4 0
0x00000000 1376262 root 0 4 0
0x00000000 1409031 root 0 4 0
0x00000000 1441800 root 0 4 0
0x00000000 1474569 root 0 4 0
0x54010004 1671178 root 0 40 0
0x00000000 1540107 root 0 4 0
shmdt() detaches the shared memory segment located at the address specified by shmaddr from the address space of the calling process. The to-be-detached segment must be currently attached with shmaddr equal to the value returned by the attaching shmat() call.
shmdt 仅从附加内存中分离 调用进程。它将不会 删除进程创建的共享内存。
有关详细信息,请阅读相应系统调用的手册页。