我通过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) ;
}
程序2从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) ;
}
答案 0 :(得分:1)
看起来你正试图在一个进程中获得通知,当另一个进程退出或以其他方式决定它已完成通信时。您可以通过在两个进程之间建立良好的旧TCP连接来轻松完成,而不是尝试通过相同的共享内存IPC来传达这一状态。然后,当一个人停止或关闭连接时,另一个将被通知,并且该通知由操作系统保证(尽管可能需要一些时间才能到达)。