繁体   English   中英

如何检测从已删除的mmap文件读取?

[英]how to detect read from deleted mmap file?

我通过RedHat 6.5中的以下步骤来创建process1共享内存:

if((shm_fd1 = shm_open(sharedfile1, (O_CREAT | O_EXCL | O_RDWR),
                   (S_IREAD | S_IWRITE))) > 0 ) {
    printf("shared memory shm_fd1 created !! \n") ;
}
ftruncate(shm_fd1, sizeof(struct_order)*iGlbCallCnt );
if((ptrsharedCall = (struct_order*) mmap(0, sizeof(struct_order)*iGlbCallCnt , (PROT_READ | PROT_WRITE),
               MAP_SHARED, shm_fd1, 0)) == MAP_FAILED) 
{
    printf("shared memory shm_fd1 mmap error , errno=(%d)\n",errno) ;
    printf("try to remove /dev/shm/ file \n") ;
    exit(0) ;
}

procees2从process1创建的数据中读取数据:

if((shm_fd1 = shm_open(sharedfile1, (O_RDWR),
                   (S_IREAD | S_IWRITE))) < 0 ) {
    printf("shared memory shm_fd1  error  !! \n") ;
    exit(0) ;
}
ftruncate(shm_fd1, sizeof(struct_order)*iGlbCallCnt );
if((ptrsharedCall = (struct_order*) mmap(0, sizeof(struct_order)*iGlbCallCnt , (PROT_READ | PROT_WRITE),
               MAP_SHARED, shm_fd1, 0)) == MAP_FAILED)
{
    printf("shared memory shm_fd1 mmap error , errno=(%d)\n",errno) ;
    printf("try to remove /dev/shm/ file \n") ;
    exit(0) ;
}

它工作正常,但我想通知process2,而process1通过以下方式删除共享内存文件:

sprintf(filenm1,"%s%s","/dev/shm/",sharedfile1) ;
unlink(filenm1);

到目前为止,我不知道如何process2来检测该共享的内存文件已被删除,任何想法吗?

编辑:

在共享内存文件中使用stat可以吗? process2可以检测到通过以下方式删除的文件:

    #include <sys/stat.h>

    if(stat(filenm1,&sts) < 0)
    {
        printf("(%s) deleted \n",filenm1) ;
        exit(0)  ;
    }

似乎您正在尝试在一个进程中获得通知,而另一个进程退出或以其他方式确定已完成通信。 您可以通过在两个进程之间建立良好的旧TCP连接来轻松实现此状态,而不必尝试通过相同的共享内存IPC来传达此状态。 然后,当其中一个停止或关闭连接时,将通知另一个,该通知由操作系统保证(尽管可能需要一些时间才能到达)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM