首页 > 解决方案 > 从 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 呢?

标签: unixexecposixshared-memory

解决方案


推荐阅读