Результатом является то, что возвращаемое 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()