ОБЗОР
#include <unistd.h>
int fexecve(int fd, char *const argv[], char *const envp[]);
Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):
fexecve():
-
- Начиная с glibc 2.10:
- _XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L
- До glibc 2.10:
- _GNU_SOURCE
ОПИСАНИЕ
Функция fexecve() выполняет ту же задачу, что и execve(2), только выполняемый файл указывается посредством файлового дескриптора fd, а не через путь к файлу. Файловый дескриптор fd должен быть открыт только для чтения и вызывающий должен иметь права на выполнение файла, на который ссылается дескриптор.ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении fexecve() не возвращает управление. При ошибке функция возвращает выполнение с результатом -1, а errno устанавливает в соответствующее значение.ОШИБКИ
Возникают те же ошибки что и для execve(2), а также дополнительно:- EINVAL
- Значение fd не является правильным файловым дескриптором или argv равно NULL, или envp равно NULL.
- ENOSYS
- Нет доступа к файловой системе /proc.
ВЕРСИИ
Функция fexecve() появилась в glibc 2.3.2.АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).Интерфейс | Атрибут | Значение |
fexecve() | безвредность в нитях | безвредно (MT-Safe) |
СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2008. Эта функция не определена в POSIX.1-2001 и широко не распространена среди других систем. Она определена в POSIX.1-2008.ЗАМЕЧАНИЯ
В Linux, fexecve() реализована с использованием файловой системы proc(5), поэтому /proc должна быть смонтирована и доступна на момент вызова.Предназначение fexecve() — позволить вызывающему проверить содержимое исполняемого файла (контрольную сумму) до запуска. Простого открытия файла, вычисления контрольной суммы содержимого и выполнения execve(2) недостаточно, так как между двумя этими шагами может измениться имя файла или каталог пути (например, посредством изменения цели символьной ссылки). Функция fexecve() не решает проблему возможного изменения содержимого файла между проверкой контрольной суммы и вызовом fexecve() — для этого есть права на файл, которые должны предотвращать его несанкционированное изменение.
Естественная идиома при использовании fexecve() — установить флаг закрытия-при-выполнении на fd для того, чтобы дескриптор файла не утекал выполняемой программе. Этот подход естественен по двум причинам. Во-первых, это предотвращает трату дескрипторов файлов без надобности (выполняемой программе, обычно, не нужен дескриптор файла, который ссылается на саму программу). Во-вторых, если fexecve() использовать рекурсивно, то применение флага закрытия-при-выполнении предотвращает исчерпание дескрипторов файлов, которое произошло бы, так как каждый шаг в рекурсии вызывает передачу ещё одного дескриптора файла новой программе (но смотрите ДЕФЕКТЫ).