2016-04-29 113 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() 。也许有东西取消链接文件?