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

ИМЯ

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

LIBRARY

       Standard C library (libc, -lc)

СИНТАКСИС

       #include <linux/fcntl.h>      /* определения констант AT_* */
       #include <unistd.h>

       int execveat(int dirfd, const char *pathname,
                    char *const _Nullable argv[],
                    char *const _Nullable envp[],
                    int flags);

ОПИСАНИЕ

       Системный  вызов  execveat()  выполняет программу, на которую ссылается комбинация dirfd и
       pathname. Он работает  также  как  системный  вызов  execve(2),  за  исключением  случаев,
       описанных в данной справочной странице.

       Если  в  pathname  задан  относительный  путь,  то  он считается относительно каталога, на
       который ссылается файловый дескриптор dirfd (а не относительно текущего рабочего  каталога
       вызывающего процесса, как это делается в execve(2)).

       Если  в pathname задан относительный путь и dirfd равно специальному значению AT_FDCWD, то
       pathname рассматривается относительно текущего рабочего каталога вызывающего процесса (как
       execve(2)).

       Если в pathname задан абсолютный путь, то dirfd игнорируется.

       Если  pathname — пустая строка и указан флаг AT_EMPTY_PATH, то файловым дескриптором dirfd
       задаётся выполняемый файл (т. е., dirfd ссылается на исполняемый файл, а не на каталог).

       Аргумент flags является битовой маской, которая может включать ноль  или  более  следующих
       флагов:

       AT_EMPTY_PATH
              Если  значение  pathname равно пустой строке, то вызов выполняет действие с файлом,
              на который ссылается dirfd (может быть получен с помощью open(2) с флагом O_PATH).

       AT_SYMLINK_NOFOLLOW
              Если файл задаётся dirfd и pathname — символическая  ссылка  (не  NULL),  то  вызов
              завершается с ошибкой ELOOP.

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

       On  success,  execveat()   does not return.  On error, -1 is returned, and errno is set to
       indicate the error.

ОШИБКИ

       В execveat() могут возникнуть те же ошибки, что и в execve(). Также,  в  execveat()  могут
       возникнуть следующие ошибки:

       pathname
              is relative but dirfd is neither AT_FDCWD nor a valid file descriptor.

       EINVAL Указано неверное значение в flags.

       ELOOP  Значение  flags  содержит  AT_SYMLINK_NOFOLLOW  и файл задаётся dirfd, а pathname —
              символическая ссылка (не NULL).

       ENOENT Программа задаётся dirfd и  по  pathname  требуется  использовать  интерпретирующую
              программу  (то  есть  сценарий,  начинающийся с «#!»), но файловый дескриптор dirfd
              открыт  с  флагом  O_CLOEXEC,  что  приводит  к   недоступности   файла   программы
              запускаемому интерпретатору. Смотрите ДЕФЕКТЫ.

       ENOTDIR
              Значение pathname содержит относительный путь и dirfd содержит файловый дескриптор,
              указывающий на файл, а не на каталог.

ВЕРСИИ

       execveat()  was added in Linux 3.19.  Library support was added in glibc 2.34.

СТАНДАРТЫ

       Системный вызов execveat() есть только в Linux.

ЗАМЕЧАНИЯ

       В дополнении к  причинам,  описанным  в  openat(2),  системному  вызову  execveat()  также
       требуется  разрешить  fexecve(3)  для  реализации  в системах, у которых не смонтированной
       файловой системы /proc.

       При запросе  запуска  файла  сценария,  значение  argv[0],  передаваемое  в  интерпретатор
       сценарий,  является  строкой  в  виде  /dev/fd/N  или /dev/fd/N/P, где N — номер файлового
       дескриптора, передаваемого через аргумент dirfd.  Строка  в  первом  формате  встречается,
       когда  указан AT_EMPTY_PATH. Строка во втором формате встречается, когда сценарий задаётся
       сразу через dirfd и pathname; в этом случае P — это значение, указанное в pathname.

       По  причинам,  описанным  в  fexecve(3),  естественным  подходом  является   использование
       execveat() с установленным флагом close-on-exec у dirfd (но смотрите ДЕФЕКТЫ).

ДЕФЕКТЫ

       Ошибка  ENOENT,  описанная  выше, означает, что невозможно установить флаг close-on-exec у
       файлового дескриптора, переданного вызову в виде:

           execveat(fd, "", argv, envp, AT_EMPTY_PATH);

       Однако неспособность установить флаг close-on-exec означает утечку файловых  дескрипторов,
       через  ссылку  сценария  на  самого  себя.  Помимо  траты файлового дескриптора, это может
       привести к исчерпанию файловых дескрипторов, если сценарии рекурсивно вызывают execveat().

СМ. ТАКЖЕ

       execve(2), openat(2), fexecve(3)

ПЕРЕВОД

       Русский   перевод   этой    страницы    руководства    был    сделан    Azamat    Hackimov
       <azamat.hackimov@gmail.com>,    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⟩.