SHMDT 和 SHMCTL 不删除共享内存位置

SHMDT and SHMCTL not deleting Shared Memory Location

我目前正在练习使用 fork 将一些行写入共享内存并在打印完所有行后终止。根据我的理解,程序终止后 shmdt 和 shmctl 会在执行后删除共享内存位置。我有这两个语句,在我的程序结束后,我仍然看到来自 运行ning 程序的共享内存位置。为了澄清,我在终端 killall -u 中 运行,然后是 ipcrm --all 以确保我在 运行 时没有共享内存位置。在我 运行 之后应该没有内存位置。

#include <stdio.h>
#include <sys/shm.h>
#include <sys/stat.h>
int
main()
{
    int           pid;
    int             segment_id;
    char           *shared_memory="User";
    const int       segment_size = 4096;
    segment_id = shmget(IPC_PRIVATE, segment_size, S_IRUSR | S_IWUSR);
    shared_memory = (char *) shmat(segment_id, NULL, 0);
    
    sprintf(shared_memory, "I am process A");
    printf("%s\n", shared_memory);

    
    if (fork() == 0) { 
        sprintf(shared_memory, "I am process B");
        printf("%s\n", shared_memory);
        pause();
        exit(0);
    } else {
        if (fork() == 0){
            sprintf(shared_memory, "I am process C");
            printf("%s\n", shared_memory);
            pause();
            exit(0);
        }else{
            usleep(100);
            exit(0);
        }
        
    }
    if (shmdt(shared_memory) == -1) {
            fprintf(stderr, "Unable to detach\n");
        }
    shmctl(segment_id, IPC_RMID, NULL);
    return 0;
}

TL;DR:向您的子进程发送信号,并删除 usleep(100)

之后的 exit(0)

您的父进程创建段,然后分叉。等待信号的分叉进程调用 pause() - none 似乎即将到来。

if/else/[if/else] 的最终分支休眠然后退出,因此您对 shmdt() 的尝试永远不会执行。