unix - 从 shm_open() fd 中删除 FD_CLOEXEC 是否可移植?
问题描述
以下技术通过子进程通过 exec 继承的文件描述符将共享内存从父进程传递到其子进程。
它在不同的类 Unix 操作系统中的可移植性如何?
父进程:
fd = shm_open(name, O_RDWR | O_CREAT | O_EXCL, 0600);
shm_unlink(name);
flags = fcntl(fd, F_GETFD);
flags &= ~FD_CLOEXEC; // Clear the close-on-exec flag.
fcntl(fd, F_SETFD, flags);
ftruncate(fd, (off_t)size);
buf = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
父进程使用 fork 和 exec 启动的子进程:
fstat(fd, &st); // fd is known file descriptor number from parent process.
size = st.st_size;
buf = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
POSIXshm_open
规范说:
设置了与新文件描述符关联的 FD_CLOEXEC 文件描述符标志。
但它没有说明使用 . 手动删除该标志是否允许或有效fcntl()
。
我能够让它在 MacOS 上运行,但这是否更普遍?Linux、*BSD 和 Solaris 呢?