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