Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 共享内存段可以';调用shmdt()后无法删除_C++_C_Linux_Ipc_Shared Memory - Fatal编程技术网

C++ 共享内存段可以';调用shmdt()后无法删除

C++ 共享内存段可以';调用shmdt()后无法删除,c++,c,linux,ipc,shared-memory,C++,C,Linux,Ipc,Shared Memory,我成功调用了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 =

我成功调用了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;
}
shmdt()分离位于地址处的共享内存段 由shmaddr从调用进程的地址空间指定。 要分离的段当前必须与shmaddr连接 等于附加的shmat()调用返回的值

shmdt only从连接的内存中分离调用进程。它不会删除进程创建的共享内存。
有关更多信息,请阅读相应系统调用的手册页

shmdt()分离位于地址处的共享内存段 由shmaddr从调用进程的地址空间指定。 要分离的段当前必须与shmaddr连接 等于附加的shmat()调用返回的值

shmdt only从连接的内存中分离调用进程。它不会删除进程创建的共享内存。

有关更多信息,请阅读相应系统调用的手册页。

您需要使用
shmctl(shmid,IPC\u RMID,NULL)
删除共享内存段。当shmid_ds::shm_natch==0时,共享内存段将自动删除???@Gaurav PathakNo,它仅指示您的共享内存是否与任何进程连接。如果shmid\u ds->shm\u nattach==0,则表示可以将其附加到另一个进程。您需要使用
shmctl(shmid,IPC\u RMID,NULL)
删除共享内存段。当shmid_ds::shm_natch==0时,共享内存段将自动删除???@Gaurav PathakNo,它仅指示您的共享内存是否与任何进程连接。如果shmid_ds->shm_nattach==0,则表示可以将其附加到另一个进程。
# 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