Provided by:
manpages-ru_0.98-4_all 
ИМЯ
execve - выполнить программу
ОБЗОР
#include <unistd.h>
int execve(const char *filename, char *const argv [], char *const
envp[]);
ОПИСАНИЕ
execve() выполняет программу, заданную параметром filename. Программа
должна быть или двоичным исполняемым файлом, или скриптом, начинающимся
со строки вида "#! [аргументы]". В последнем случае
интерпретатор -- это правильный путь к исполняемому файлу, который не
является скриптом; этот файл будет выполнен как интерпретатор [arg]
filename.
argv -- это массив строк, аргументов новой программы. envp -- это
массив строк в формате key=value, которые передаются новой программе в
качестве окружения (environment). Как argv, так и envp завершаются
нулевым указателем. К массиву аргументов и к окружению можно
обратиться из функции main(), которая объявлена как int main(int argc,
char *argv[], char *envp[]).
execve() не возвращает управление при успешном выполнении, а код,
данные, bss и стек вызвавшего процесса перезаписываются кодом, данными
и стеком загруженной программы. Новая программа также наследует от
вызвавшего процесса его идентификатор и открытые файловые дескрипторы,
на которых не было флага закрыть-при-exec (close-on-exec, COE).
Сигналы, ожидающие обработки, удаляются. Переопределённые обработчики
сигналов возвращаются в значение по умолчанию. Обработчик сигнала
SIGCHLD (когда установлен в SIG_IGN) может быть сброшен или не сброшен
в SIG_DFL.
Если текущая программа выполнялась под управлением ptrace, то после
успешного execve() ей посылается сигнал SIGTRAP.
Если на файле программы filename установлен setuid-бит, то фактический
идентификатор пользователя вызывавшего процесса меняется на
идентификатор владельца файла программы. Точно так же, если на файле
программы установлен setgid-бит, то фактический идентификатор группы
устанавливается в группу файла программы.
Если исполняемый файл является динамически-скомпонованным файлом в
формате a.out, содержащим заглушки для вызова разделяемых библиотек, то
в начале выполнения этого файла вызывается динамический компоновщик
ld.so(8), который загружает библиотеки и компонует их с исполняемым
файлом.
Если исполняемый файл является динамически-скомпонованным файлом в
формате ELF, то для загрузки разделяемых библиотек используется
интерпретатор, указанные в сегменте PT_INTERP. Обычно это /lib/ld-
linux.so.1 для программ, скомпилированных под Linux libc версии 5, или
же /lib/ld-linux.so.2 для программ, скомпилированных под GNU libc
версии 2.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном завершении execve() не возвращает управление, при ошибке
возвращается -1, а значение errno устанавливается должным образом.
КОДЫ ОШИБОК
EACCES Интерпретатор файла или скрипта не является обычным файлом.
EACCES Нет прав на выполнение файла, скрипта или ELF-интерпретатора.
EACCES Файловая система смонтирована с флагом noexec.
EPERM Файловая система смонтирована с флагом nosuid, пользователь не
является суперпользователем, а на файле установлен бит setuid
или setgid.
EPERM Процесс работает под отладчиком, пользователь не является
суперпользователем, а на файле установлен бит setuid или setgid.
E2BIG Список аргументов слишком велик.
ENOEXEC
Исполняемый файл в неизвестном формате, для другой архитектуры,
или же встречены какие-то ошибки, препятствующие его выполнению.
EFAULT filename указывает за пределы доступного адресного пространства.
ENAMETOOLONG
filename слишком длинное.
ENOENT Файл filename, или интерпретатор скрипта или ELF-файла не
существует, или же не найдена разделяемая библиотека, требуемая
файлу или интерпретатору.
ENOMEM Недостаточно памяти в ядре.
ENOTDIR
Компонент пути filename, или интерпретатору скрипта или
ELF-интерпретатору не является каталогом.
EACCES Нет прав на поиск в одном из каталогов по пути к filename, или
имени интерпретатора скрипта или ELF-интерпретатора.
ELOOP Слишком много символьных ссылок встречено при поиске filename,
или интерпретатора скрипта или ELF-интерпретатора.
ETXTBSY
Исполняемый файл открыт для записи одним или более процессами.
EIO Произошла ошибка ввода-вывода.
ENFILE Достигнут системный лимит на общее количество открытых файлов.
EMFILE Процесс уже открыл максимально доступное количество открытых
файлов.
EINVAL Исполняемый файл в формате ELF содержит более одного сегмента
PT_INTERP (то есть, в нем указано более одного интерпретатора).
EISDIR ELF-интерпретатор является каталогом.
ELIBBAD
ELF-интерпретатор имеет неизвестный формат.
СООТВЕТСТВИЕ СТАНДАРТАМ
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.
ЗАМЕЧАНИЯ
SUID и SGID процессы не могут быть оттрассированы ptrace()d.
Linux игнорирует SUID и SGID биты на скриптах.
Результат монтирования файловой системы с опцией nosuid различается в
зависимости от версий ядра Linux: некоторые ядра будут отвергать
выполнение SUID/SGID программ, когда это должно дать пользователю те
возможности, которыми он уже не обладается (и возвращать EPERM),
некоторые ядра будут просто игнорировать SUID/SGID биты, но успешно
производить запуск программы.
Первая строка (строка с #!) исполняемого скрипта не может быть длиннее
127 символов.
СМОТРИ ТАКЖЕ
chmod(2), fork(2), execl(3), environ(5), ld.so(8)
ПЕРЕВОД
Дополнения к первоначальному переводу: Виктор Вислобоков
<corochoone@perm.ru> 2003