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

НАИМЕНОВАНИЕ

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

БИБЛИОТЕКА

       Стандартная библиотека языка C (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
              является относительным, но dirfd не является ни AT_FDCWD, ни допустимым файловым дескриптором.

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

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

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

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

СТАНДАРТЫ

       Linux.

ИСТОРИЯ

       Linux 3.19, glibc 2.34.

ПРИМЕЧАНИЯ

       В дополнении к причинам, описанным в 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> и Kirill Rekhov <krekhov.dev@gmail.com>

       Этот перевод является свободной программной документацией; он распространяется на условиях  общедоступной
       лицензии  GNU  (GNU  General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или
       более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

       Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите  об  этом
       разработчику(ам)   по   его(их)  адресу(ам)  электронной  почты  или  по  адресу  списка рассылки русских
       переводчиков.

Справочные страницы Linux 6.9.1                   2 мая 2024 г.                                      execveat(2)