第二个shm_open()因ENOENT而失败

时间:2016-04-29 02:46:28

标签: linux

mode_t mode = S_IRWXU | S_IRWXG | S_IRWXO;
shm_fd = shm_open("/ipc_shm", O_CREAT | O_RDWR, mode);

这样可以,为shm_fd返回4。然后,同一进程调用也调用

的库函数
fd = shm_open("/ipc_shm", O_RDWR, 0);

这个失败,errno设置为2,即ENOENT(没有这样的文件或目录)。中间没有shm_unlink调用。知道为什么第二次通话失败了。感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

my 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()。也许某些东西取消链接文件?