Provided by: manpages-ru-dev_4.19.0-7_all
ИМЯ
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⟩.