.\" Hey Emacs! This file is -*- nroff -*- source. .\" .\" Copyright (c) 1992 Drew Eckhardt (drew@cs.colorado.edu), March 28, 1992 .\" .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of this .\" manual under the conditions for verbatim copying, provided that the .\" entire resulting derived work is distributed under the terms of a .\" permission notice identical to this one .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume no .\" responsibility for errors or omissions, or for damages resulting from .\" the use of the information contained herein. The author(s) may not .\" have taken the same level of care in the production of this manual, .\" which is licensed free of charge, as they might when working .\" professionally. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" .\" Modified by Michael Haardt .\" Modified Wed Jul 21 22:47:01 1993 by Rik Faith .\" Modified 21 Aug 1994 by Michael Chastain : .\" Fixed typoes. .\" Modified Fri Jan 31 16:24:28 1997 by Eric S. Raymond .\" Modified Fri Nov 12 22:57:27 1999 by Urs Thuermann .\" .\" Дата последней коррекции перевода 14.12.2003 .\" Автор оригинального перевода не указан .\" Дополнения и правки перевода сделал Виктор Вислобоков .\" http://www.linuxshare.ru/projects/trans/mans.html .\" .TH EXECVE 2 1997-09-03 "Linux 2.0.30" "Руководство программиста Linux" .SH ИМЯ execve \- выполнить программу .SH ОБЗОР .B #include .sp .BI "int execve(const char *" filename ", char *const " argv .BI "[], char *const " envp []); .SH ОПИСАНИЕ .B execve() выполняет программу, заданную параметром .IR filename . Программа должна быть или двоичным исполняемым файлом, или скриптом, начинающимся со строки вида "\fB#! \fIинтерпретатор \fR[аргументы]". В последнем случае интерпретатор -- это правильный путь к исполняемому файлу, который не является скриптом; этот файл будет выполнен как \fBинтерпретатор\fR [arg] \fIfilename\fR. .I argv -- это массив строк, аргументов новой программы. .I envp -- это массив строк в формате .BR key=value , которые передаются новой программе в качестве окружения (environment). Как .IR argv , так и .I envp завершаются нулевым указателем. К массиву аргументов и к окружению можно обратиться из функции .BR main (), которая объявлена как \fBint main(int argc, char *argv[], char *envp[])\fR. .B execve() не возвращает управление при успешном выполнении, а код, данные, bss и стек вызвавшего процесса перезаписываются кодом, данными и стеком загруженной программы. Новая программа также наследует от вызвавшего процесса его идентификатор и открытые файловые дескрипторы, на которых не было флага закрыть-при-exec (close-on-exec, COE). Сигналы, ожидающие обработки, удаляются. Переопределённые обработчики сигналов возвращаются в значение по умолчанию. Обработчик сигнала SIGCHLD (когда установлен в SIG_IGN) может быть сброшен или не сброшен в SIG_DFL. Если текущая программа выполнялась под управлением ptrace, то после успешного .B execve() ей посылается сигнал .BR SIGTRAP . Если на файле программы .I filename установлен setuid-бит, то фактический идентификатор пользователя вызывавшего процесса меняется на идентификатор владельца файла программы. Точно так же, если на файле программы установлен setgid-бит, то фактический идентификатор группы устанавливается в группу файла программы. Если исполняемый файл является динамически-скомпонованным файлом в формате a.out, содержащим заглушки для вызова разделяемых библиотек, то в начале выполнения этого файла вызывается динамический компоновщик .BR ld.so (8), который загружает библиотеки и компонует их с исполняемым файлом. Если исполняемый файл является динамически-скомпонованным файлом в формате ELF, то для загрузки разделяемых библиотек используется интерпретатор, указанные в сегменте PT_INTERP. Обычно это .I /lib/ld-linux.so.1 для программ, скомпилированных под Linux libc версии 5, или же .I /lib/ld-linux.so.2 для программ, скомпилированных под GNU libc версии 2. .SH "ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ" При успешном завершении .B execve() не возвращает управление, при ошибке возвращается \-1, а значение .I errno устанавливается должным образом. .SH КОДЫ ОШИБОК .TP .B EACCES Интерпретатор файла или скрипта не является обычным файлом. .TP .B EACCES Нет прав на выполнение файла, скрипта или ELF-интерпретатора. .TP .B EACCES Файловая система смонтирована с флагом .IR noexec . .TP .B EPERM Файловая система смонтирована с флагом .IR nosuid , пользователь не является суперпользователем, а на файле установлен бит setuid или setgid. .TP .B EPERM Процесс работает под отладчиком, пользователь не является суперпользователем, а на файле установлен бит setuid или setgid. .TP .B E2BIG Список аргументов слишком велик. .TP .B ENOEXEC Исполняемый файл в неизвестном формате, для другой архитектуры, или же встречены какие-то ошибки, препятствующие его выполнению. .TP .B EFAULT .I filename указывает за пределы доступного адресного пространства. .TP .B ENAMETOOLONG .I filename слишком длинное. .TP .B ENOENT Файл .IR filename , или интерпретатор скрипта или ELF-файла не существует, или же не найдена разделяемая библиотека, требуемая файлу или интерпретатору. .TP .B ENOMEM Недостаточно памяти в ядре. .TP .B ENOTDIR Компонент пути .IR filename , или интерпретатору скрипта или ELF-интерпретатору не является каталогом. .TP .B EACCES Нет прав на поиск в одном из каталогов по пути к .IR filename , или имени интерпретатора скрипта или ELF-интерпретатора. .TP .B ELOOP Слишком много символьных ссылок встречено при поиске .IR filename , или интерпретатора скрипта или ELF-интерпретатора. .TP .B ETXTBSY Исполняемый файл открыт для записи одним или более процессами. .TP .B EIO Произошла ошибка ввода-вывода. .TP .B ENFILE Достигнут системный лимит на общее количество открытых файлов. .TP .B EMFILE Процесс уже открыл максимально доступное количество открытых файлов. .TP .B EINVAL Исполняемый файл в формате ELF содержит более одного сегмента PT_INTERP (то есть, в нем указано более одного интерпретатора). .TP .B EISDIR ELF-интерпретатор является каталогом. .TP .B ELIBBAD ELF-интерпретатор имеет неизвестный формат. .SH "СООТВЕТСТВИЕ СТАНДАРТАМ" SVr4, SVID, X/OPEN, BSD 4.3. POSIX не документирует поведение, связанное с #!, но в остальном совершенно совместимо. SVr4 документирует дополнительные коды ошибок EAGAIN, EINTR, ELIBACC, ENOLINK, EMULTIHOP; POSIX не документирует коды ошибок ETXTBSY, EPERM, EFAULT, ELOOP, EIO, ENFILE, EMFILE, EINVAL, EISDIR и ELIBBAD. .SH ЗАМЕЧАНИЯ SUID и SGID процессы не могут быть оттрассированы \fBptrace()\fPd. Linux игнорирует SUID и SGID биты на скриптах. Результат монтирования файловой системы с опцией .I nosuid различается в зависимости от версий ядра Linux: некоторые ядра будут отвергать выполнение SUID/SGID программ, когда это должно дать пользователю те возможности, которыми он уже не обладается (и возвращать EPERM), некоторые ядра будут просто игнорировать SUID/SGID биты, но успешно производить запуск программы. Первая строка (строка с #!) исполняемого скрипта не может быть длиннее 127 символов. .\" .SH BUGS .\" Some Linux versions have failed to check permissions on ELF .\" interpreters. This is a security hole, because it allows users to .\" open any file, such as a rewinding tape device, for reading. Some .\" Linux versions have also had other security holes in \fBexecve()\fP, .\" that could be exploited for denial of service by a suitably crafted .\" ELF binary. There are no known problems with 2.0.34 or 2.2.15. .SH "СМОТРИ ТАКЖЕ" .BR chmod (2), .BR fork (2), .BR execl (3), .BR environ (5), .BR ld.so (8) .SH ПЕРЕВОД Дополнения к первоначальному переводу: Виктор Вислобоков 2003