首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SHMDT和SHMCTL不删除共享内存位置

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

Stack Overflow用户
提问于 2022-02-21 23:34:09
回答 1查看 108关注 0票数 0

我目前正在练习使用叉子将一些行写入共享内存,并在所有行打印后终止。据我所知,在程序终止shmdt和shmctl之后,一旦执行,将删除共享内存位置。我有这两条语句,在我的程序结束后,我仍然可以看到运行该程序的共享内存位置。为了澄清起见,我在终端killall -u中运行,然后运行ipcrm --所有这些都是为了确保在运行时没有共享内存位置。在我运行之后,应该没有内存位置。

代码语言:javascript
复制
#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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-22 00:40:28

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71214248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档