Результатом является то, что возвращаемое nice() значение в действительности изменяется от '-NZERO
NZERO-1
', и лучше всего писать свой код в терминах этой именованной константы. Однако, на практике трудно найти систему, в которой NZERO
не было бы равно 20.9.1.4. Запуск новой программы: семейство exec()
После запуска нового процесса (посредством fork()
#include
int execve(const char *filename, /* Системный вызов */
char *const argv[], char *const envp[]);
int execl(const char *path, const char *arg, ...); /* Оболочки */
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ..., char *const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
Мы ссылаемся на эти функции как на «семейство exec()
exec()
нет; вместо этого мы используем это имя для обозначения любой из перечисленных выше функций. Как и в случае с fork()
, «exec
» используется на языке Unix и в качестве глагола, означающего исполнение (запуск) программы, и в качестве существительного.9.1.4.1. Системный вызов execve()
Простейшей для объяснения функцией является execve()
int execve(const char *filename, char *const argv[],
char* const envp[]);
filename
execve()
можно исполнять интерпретируемые сценарии, если они используют особую первую строку с именем интерпретатора, начинающуюся с '#!
'. (Сценарии, которые не начинаются с '#!
', потерпят неудачу.) В разделе 1.1.3 «Исполняемые файлы» представлен пример использования '#!'. argv является стандартным списком аргументов С — массив символьных указателей на строки аргументов, argv[0]
[90], завершающийся указателем NULL
.envp
environ
(см. раздел 2.4 «Переменные окружения»). В новой программе это окружение становится начальным значением environ
.Программа не должна возвращаться из вызова exec()
errno ENOENT
и EACCESS
соответственно). Может быть множество других ошибок; см. справочную страницу В предположении, что вызов был успешным, текущее содержимое адресного пространства процесса сбрасывается. (Ядро сначала сохраняет в безопасном месте данные argv
envp
.) Ядро загружает для новой программы исполняемый код вместе со всеми глобальными и статическими переменными. Затем ядро инициализирует переменные окружения переданными execve()
данными, а далее вызывает процедуру main()
новой программы с переданным функции execve()
массивом argv
. Подсчитывается число аргументов и это значение передается main()
в argc
.К этому моменту новая программа запущена. Она не знает (и не может определить), какая программа была в процессе до нее. Обратите внимание, что ID процесса
exec
сохраняются; вскоре мы рассмотрим это более подробно.exec()
exec()
программа — может измениться.9.1.4.2. Функции-оболочки: execl()