Это портативный, чтобы удалить FD_CLOEXEC из shm_open () fd? - PullRequest
1 голос
/ 16 апреля 2019

Следующая методика передает совместно используемую память от родительского процесса его дочернему процессу через дескриптор файла, унаследованный дочерним процессом через 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);

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

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

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

Мне удалось заставить его работать на MacOS, но это работает в целом? А как насчет Linux, * BSD и Solaris?

...