2016-04-29 61 views
0
mode_t mode = S_IRWXU | S_IRWXG | S_IRWXO; 
shm_fd = shm_open("/ipc_shm", O_CREAT | O_RDWR, mode); 

這個工作,返回4爲shm_fd。然後相同的過程調用的庫函數也調用第二個shm_open()失敗,ENOENT

fd = shm_open("/ipc_shm", O_RDWR, 0); 

這一個發生故障,errno設置爲2,即ENOENT(沒有這樣的文件或目錄)。中間沒有shm_unlink調用。任何想法爲什麼第二個電話失敗。感謝你的幫助。

+0

我可以重現這一點的唯一方法是如果確實共享內存以某種方式解除鏈接。如果沒有從該程序完成,則由另一個完成。 –

回答

1

我test.c的:

#include <sys/mman.h> 
#include <sys/stat.h>  /* For mode constants */ 
#include <fcntl.h>   /* For O_* constants */ 

int main (int argc, char *argv[]) 
{ 
     mode_t mode = S_IRWXU | S_IRWXG | S_IRWXO; 
     int shm_fd = shm_open("/ipc_shm", O_CREAT | O_RDWR, mode); 
     int fd = shm_open("/ipc_shm", O_RDWR, 0); 

     return 0; 
} 

gcc test.c -Wall -lrt作品編譯爲預期:

$strace ./a.out 
.... 
statfs("/dev/shm/", {f_type=0x1021994, f_bsize=4096, f_blocks=22290, f_bfree=22290, f_bavail=22290, f_files=55725, f_ffree=55723, f_fsid={0, 0}, f_namelen=255, f_frsize=4096}) = 0 
futex(0xb6f5d1c0, FUTEX_WAKE_PRIVATE, 2147483647) = 0 
open("/dev/shm/ipc_shm", O_RDWR|O_CREAT|O_NOFOLLOW|O_CLOEXEC, 0777) = 3 
fcntl64(3, F_GETFD)      = 0x1 (flags FD_CLOEXEC) 
open("/dev/shm/ipc_shm", O_RDWR|O_NOFOLLOW|O_CLOEXEC) = 4 
exit_group(0)  

請在您的應用程序運行strace的,並搜索IPC的所有事件,也許的chroot() 。也許有東西取消鏈接文件?