Provided by: manpages-ru_0.98-4_all bug

ИМЯ

       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