【问题标题】:how to detect read from deleted mmap file?如何检测从已删除的 mmap 文件中读取的内容?
【发布时间】:2014-06-07 22:43:33
【问题描述】:

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

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) ;
}

它工作正常,但我想在 process1 删除共享内存文件时通知 process2:

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)  ;
    }

【问题讨论】:

  • 让两个进程通信?顺便看看how to check status of shared memory
  • @UmNyobe,是的,这是个好主意!因为是IPC,process1可以通知process2!!谢谢!!
  • 转念一想,如果process1核心转储,那么process2就不知道了,还在继续读取共享内存,所以不是那么完美。

标签: c posix shared-memory


【解决方案1】:

当另一个进程退出或以其他方式决定它已完成通信时,您似乎正试图在一个进程中获得通知。您可以通过在两个进程之间建立良好的旧 TCP 连接,而不是尝试通过相同的共享内存 IPC 来传达这一位状态。然后当一个停止或关闭连接时,会通知另一个,并且这个通知是由操作系统保证的(虽然可能需要一点时间才能到达)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    • 2020-05-09
    • 1970-01-01
    • 2021-07-03
    相关资源
    最近更新 更多