— это указатель на место, куда следует поместить код возврата прерванного процесса. Эта функция всегда блокирует выполнение до тех пор, пока дочерний процесс не будет прерван.
pid_t waitpid (pid_t pid, int *status, int options)
Функция
waitpid
подобна
wait4
. Единственное отличие в том, что она не возвращает информации об использовании ресурсов прерванным процессом.
pid_t wait3(int *status, int options, struct rusage *rusage)
Эта
функция также подобна
wait4
, но не позволяет специфицировать дочерний процесс, который должен быть проверен.
10.4.3. Запуск новых программ
Хотя доступно целых шесть способов запустить одну программу из другой, все они делают почти одно и то же — заменяют текущую выполняющуюся программу другой программой. Обратите внимание на слово "заменяет" — все следы текущей выполняющейся программы при этом исчезают. Если вы хотите оставить исходную программу работающей, вы должны создать новый процесс вызовом
fork
, а затем запустить новую программу из дочернего процесса.
Эти шесть функций лишь слегка отличаются по интерфейсу. Только одна из них —
execve
— является системным вызовом Linux. Остальные реализованы в библиотеках пользовательского пространства и вызывают
execve
для запуска новой программы. Ниже представлены прототипы семейства функций
exec
.
int execl(const char *path, const char *arg0, ...);
int execlp(const char *file, const char *arg0, ...);
int execle(const char *path, const char *arg0, ...);
int execv(const char *path, const char **argv);
int execvp(const char *file, const char **argv);
int execve(const char *file, const char **argv, const char **envp);
Как уже упоминалось, все эти программы пытаются заменить текущую программу новой. Если это удается, то управление не возвращается (то есть программа, которая вызвала другую программу, уже не выполняется). Если не удается, то возвращается значение
– 1
и устанавливается код ошибки в
errno
, как при любом другом системном вызове. Когда новая программа запускается, она принимает массив аргументов (
или execv, этот фрагмент кода завершится ошибкой, если только
cat
не окажется в текущем каталоге.
Если вы пытаетесь запустить программу со специфическим окружением, при этом желая выполнять поиск пути, вам придется искать путь вручную и использовать