[英]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.