Переносим ли он для удаления FD_CLOEXEC из shm_open() fd?

#unix #exec #posix #shared-memory

#unix #exec #posix #разделяемая память

Вопрос:

Следующий метод передает общую память от родительского процесса к его дочернему процессу через файловый дескриптор, унаследованный дочерним процессом через exec.

Насколько он переносим в разных Unix-подобных операционных системах?

Родительский процесс:

 fd = shm_open(name, O_RDWR | O_CREAT | O_EXCL, 0600);
shm_unlink(name);
flags = fcntl(fd, F_GETFD);
flags amp;= ~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, amp;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);
 

Спецификация POSIX shm_open гласит:

Установлен флаг файлового дескриптора FD_CLOEXEC, связанный с новым файловым дескриптором.

Но в нем ничего не говорится о том, допустимо или эффективно вручную удалять этот флаг с помощью fcntl() .

Я смог заставить его работать на macOS, но работает ли это в более общем плане? Как насчет Linux, * BSD и Solaris?

Комментарии:

1. Я написал пример программы и смог заставить ее работать на macOS, Linux, FreeBSD, OpenBSD, NetBSD и DragonFlyBSD. shm_open() Однако аргумент name не является тривиальным для переносимости.