Provided by: manpages-ru-dev_4.18.1-1_all bug

ИМЯ

       fexecve - запускает программу, заданную файловым дескриптором

LIBRARY

       Standard C library (libc, -lc)

СИНТАКСИС

       #include <unistd.h>

       int fexecve(int fd, char *const argv[], char *const envp[]);

   Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

       fexecve():
           Since glibc 2.10:
               _POSIX_C_SOURCE >= 200809L
           Before glibc 2.10:
               _GNU_SOURCE

ОПИСАНИЕ

       Функция  fexecve()  выполняет  ту  же  задачу,  что  и  execve(2), только выполняемый файл
       указывается посредством файлового дескриптора fd,  а  не  через  путь  к  файлу.  Файловый
       дескриптор  fd  должен  быть  открыт  только для чтения (O_RDONLY) или иметь флаг O_PATH и
       вызывающий должен иметь право на выполнение файла, на который ссылается дескриптор.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

       A successful call to fexecve()  never returns.  On error, the function does return, with a
       result value of -1, and errno is set to indicate the error.

ОШИБКИ

       Возникают те же ошибки что и для execve(2), а также дополнительно:

       EINVAL Значение  fd  не является правильным файловым дескриптором или argv равно NULL, или
              envp равно NULL.

       ENOENT На fd установлен флаг close-on-exec и  fd ссылается на сценарий. Смотрите ДЕФЕКТЫ.

       ENOSYS Ядро  не  предоставляет  системный  вызов  execveat(2)  и  файловая  система  /proc
              недоступна.

ВЕРСИИ

       Функция fexecve() появилась в glibc 2.3.2.

АТРИБУТЫ

       Описание терминов данного раздела смотрите в attributes(7).

       ┌───────────────────────────────────────────────────────┬──────────────────────┬──────────┐
       │ИнтерфейсАтрибутЗначение │
       ├───────────────────────────────────────────────────────┼──────────────────────┼──────────┤
       │fexecve()                                              │ Безвредность в нитях │ MT-Safe  │
       └───────────────────────────────────────────────────────┴──────────────────────┴──────────┘

СТАНДАРТЫ

       POSIX.1-2008.  Эта  функция  не определена в POSIX.1-2001 и широко не распространена среди
       других систем. Она определена в POSIX.1-2008.

ЗАМЕЧАНИЯ

       В Linux c glibc с версией 2.26 и старее функция  fexecve()  реализована  с  использованием
       файловой  системы  proc(5),  поэтому  /proc  должна быть смонтирована и доступна на момент
       вызова. Начиная  с  glibc  2.27,  если  используемое  ядро  поддерживает  системный  вызов
       execveat(2),  то  fexecve() реализуется через этот системный вызов и /proc монтировать уже
       не нужно.

       Предназначение fexecve() — позволить вызывающему проверить содержимое  исполняемого  файла
       (контрольную  сумму)  до  запуска.  Простого  открытия файла, вычисления контрольной суммы
       содержимого и выполнения execve(2) недостаточно, так как между двумя  этими  шагами  может
       измениться  имя  файла  или  каталог пути (например, посредством изменения цели символьной
       ссылки). Функция fexecve() не решает проблему возможного изменения содержимого файла между
       проверкой  контрольной  суммы  и вызовом fexecve() — для этого есть права на файл, которые
       должны предотвращать его несанкционированное изменение.

       Естественная идиома при использовании fexecve() — установить флаг  закрытия-при-выполнении
       на  fd  для  того,  чтобы  дескриптор  файла  не утекал выполняемой программе. Этот подход
       естественен по двум причинам. Во-первых, это предотвращает трату дескрипторов  файлов  без
       надобности (выполняемой программе, обычно, не нужен дескриптор файла, который ссылается на
       саму программу). Во-вторых, если fexecve() использовать рекурсивно,  то  применение  флага
       закрытия-при-выполнении  предотвращает  исчерпание  дескрипторов файлов, которое произошло
       бы, так как каждый шаг в рекурсии вызывает передачу ещё  одного  дескриптора  файла  новой
       программе (но смотрите ДЕФЕКТЫ).

ДЕФЕКТЫ

       Если  fd ссылается на сценарий (т. е., это исполняемый текстовый файл, у которого в первой
       строке (начинается с #!) указан  интерпретатор  сценария  и  флаг  закрытия-при-выполнении
       установлен  на fd, то fexecve() завершается с ошибкой ENOENT. Эта ошибка возникает потому,
       что на момент выполнения интерпретатора сценария  fd  уже  закрыт,  так  как  указан  флаг
       закрытия-при-выполнении.   Таким   образом  флаг  закрытия-при-выполнении  не  может  быть
       установлен fd, если он указывает на сценарий, так как это приводит к проблемам,  описанным
       в ЗАМЕЧАНИЯХ.

СМ. ТАКЖЕ

       execve(2), execveat(2)

ПЕРЕВОД

       Русский    перевод    этой    страницы    руководства    был    сделан   Azamat   Hackimov
       <azamat.hackimov@gmail.com>,  Dmitry  Bolkhovskikh  <d20052005@yandex.ru>,   Yuri   Kozlov
       <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>

       Этот  перевод  является  бесплатной  документацией;  прочитайте  Стандартную  общественную
       лицензию GNU версии 3 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ или более позднюю, чтобы
       узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

       Если  вы  обнаружите  ошибки  в  переводе этой страницы руководства, пожалуйста, отправьте
       электронное письмо на ⟨man-pages-ru-talks@lists.sourceforge.net⟩.