#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 не является тривиальным для переносимости.