Добавить или удалить действие «закрыть файл» в объект действий над файлами
#include <posix_spawn_file_actions.h>int posix_spawn_file_actions_addclose( posix_spawn_file_actions_t *fact_p,int fd );
libc
Эта функция добавляет или удаляет действие close() или open() в объект действий файла порожденного процесса. Объект действий файла порожденного процесса имеет тип posix_spawn_file_actions_t
(определено в <spawn.h>
). Они определяют ряд действий, которые должны быть выполнены операцией posix_spawn() или posix_spawnp()), чтобы добавить в набор дескрипторов открытых файлов для дочернего процесса с заданным набором дескрипторов открытых файлов родителя. IEEE Std 1003.1-2001 не определяет операторы сравнения или присваивания для типа posix_spawn_file_actions_t
.
При передаче в posix_spawn() или posix_spawnp() объект действий с файлом порожденного процесса указывает, как набор дескрипторов открытых файлов в вызывающем процессе преобразуется в набор дескрипторов потенциально открытых файлов для порожденного процесса. Это преобразование происходит так, как если бы указанная последовательность действий была выполнена ровно один раз в контексте порожденного процесса (до выполнения нового образа процесса) в том порядке, в котором действия были добавлены к объекту. Кроме того, при выполнении нового образа процесса любой файловый дескриптор (из этого нового набора), для которого установлен флаг FD_CLOEXEC
, будет закрыт (см. posix_spawn()). Функция posix_spawn_file_actions_addclose() добавляет действие close() к объекту, на который ссылается fact_p, что приводит к закрытию файлового дескриптора fd (как если бы он вызывал close( fd )) при порождении нового процесса, используя этот объект файловых действий.
Объект действий файла порожденного процесса может быть инициализирован, чтобы содержать упорядоченную последовательность операций close(), dup2() и open(), используемых posix_spawn() или posix_spawnp() для добавления в набор дескрипторов открытых файлов, унаследованных порожденным процессом из набора дескрипторов открытых файлов в родительском во время вызова posix_spawn() или posix_spawnp(). Используйте операции close() и dup2(), чтобы изменить порядок файловых дескрипторов. Файлы, которые должны быть открыты для использования порожденным процессом, могут быть обработаны либо путем открытия их вызывающим процессом до вызова posix_spawn() или posix_spawnp() (и закрытия их после), либо с помощью передачи имен файлов порожденному процессу (в argv), чтобы он мог открыть их сам. В стандартах рекомендуется, чтобы приложения использовали один из этих двух методов, когда это целесообразно, так как подробный статус ошибки при неудачной операции open() таким образом всегда доступен приложению. Тем не менее, разрешение объекту действий файла порожденного процесса указывать открытые операции по-прежнему уместно, потому что:
Важно отметить, что действие открытия файла порождения предоставляет posix_spawn() и posix_spawnp() те же возможности, которые операторы перенаправления оболочки предоставляют system(), только не вмешиваясь в выполнение оболочки; Например:
system( "myprog <file1 3<file2" );
Также нужно иметь ввиду, что если вызывающему процессу необходимо открыть один или несколько файлов для пердосталения доступа порожденным процессом, но у него недостаточно дескрипторов запасных файлов, то действие открытия необходимо закрыть (оно должно оставаться открытым в родительском процессе). Кроме того, если родитель выполняется из файла с установленным битом режима «set-user-id», а в атрибутах порождения установлен флаг POSIX_SPAWN_RESETIDS
, файл, созданный в родительском процессе, будет (возможно, неверно) иметь родительский эффективный идентификатор пользователя в качестве его владельца, тогда как файл, созданный с помощью действия open() во время posix_spawn() или posix_spawnp(), будет иметь реальный идентификатор родителя в качестве своего владельца; и открытие родительским процессом может успешно открыть файл, к которому реальный пользователь не должен иметь доступа, или не открыть файл, к которому реальный пользователь должен иметь доступ.
Сопоставление файловых дескрипторов. Изначально разработчиками стандарта предлагалось использовать массив, определяющий сопоставление дочерних файловых дескрипторов с дескрипторами родительского. Далее стало понятно, что невозможно произвольно перетасовать файловые дескрипторы в библиотечной реализации posix_spawn() или posix_spawnp() без предоставления одной или нескольких запасных записей файловых дескрипторов (которые могут быть недоступны). Такой массив требует, чтобы реализация разработала сложную стратегию для достижения желаемого сопоставления без непреднамеренного закрытия неправильного файлового дескриптора в неподходящее время. Член рабочей группы Ada Language Bindings отметил, что утвержденное семейство Ada Language Start_Process примитивов процесса POSIX использует указанный вызывающей стороной набор файловых действий для изменения обычной семантики fork/exec для наследования файловых дескрипторов в очень гибкой форме. Таким образом, таких проблем не существует, потому что бремя определения того, как добиться окончательного сопоставления дескриптора файла, полностью лежит на приложении. Кроме того, хотя интерфейс действий с файлами на первый взгляд кажется пугающим, на самом деле его довольно просто реализовать как в библиотеке, так и в ядре.
OPEN_MAX}
.POSIX 1003.1 Realtime Signals Extension
close(), dup2(), open(), posix_spawn(), posix_spawnp(), posix_spawn_file_actions_adddup2(), posix_spawn_file_actions_addopen(), posix_spawn_file_actions_destroy(), posix_spawn_file_actions_init(), posix_spawnattr_addpartid(), posix_spawnattr_addpartition(), posix_spawnattr_destroy(), posix_spawnattr_getcred(), posix_spawnattr_getflags(), posix_spawnattr_getnode(), posix_spawnattr_getpartid(), posix_spawnattr_getpgroup(), posix_spawnattr_getrunmask(), posix_spawnattr_getschedparam(), posix_spawnattr_getschedpolicy(), posix_spawnattr_getsigdefault(), posix_spawnattr_getsigignore(), posix_spawnattr_getsigmask(), posix_spawnattr_getstackmax(), posix_spawnattr_getxflags(), posix_spawnattr_init(), posix_spawnattr_setcred(), posix_spawnattr_setflags(), posix_spawnattr_setnode(), posix_spawnattr_setpgroup(), posix_spawnattr_setschedparam(), posix_spawnattr_setrunmask(), posix_spawnattr_setschedpolicy(), posix_spawnattr_setsigdefault(), posix_spawnattr_setsigignore(), posix_spawnattr_setsigmask(), posix_spawnattr_setstackmax(), posix_spawnattr_setxflags(), system()
Предыдущий раздел: Описание API системной библиотеки