Unix - статьи



         

Процессы и потоки - часть 5


программа выполнит команду ls –al и возвратит сведения о том, как был завершен соответствующий процесс. Ниже приводится полный исходный текст exec.

#include <sys/types.h> #include <sys/wait.h> #include <stdlib.h> #include <stdio.h> #include <errno.h> int main(int argc, char * argv[]) { int pid, status; if (argc < 2) { printf("Usage: %s command, [arg1 [arg2]...]\n", argv[0]); return EXIT_FAILURE; } printf("Starting %s...\n", argv[1]); pid = fork(); if (pid == 0) { execvp(argv[1], &argv[1]); perror("execvp"); return EXIT_FAILURE; // Never get there normally } else { if (wait(&status) == -1) { perror("wait"); return EXIT_FAILURE; } if (WIFEXITED(status)) printf("Child terminated normally with exit code %i\n", WEXITSTATUS(status)); if (WIFSIGNALED(status)) printf("Child was terminated by a signal #%i\n", WTERMSIG(status)); if (WCOREDUMP(status)) printf("Child dumped core\n"); if (WIFSTOPPED(status)) printf("Child was stopped by a signal #%i\n", WSTOPSIG(status)); } return EXIT_SUCCESS; }

Поскольку мы хотим, чтобы новая программа не заменяла старую, а выполнялась одновременно с ней, мы раздваиваем процесс с помощью fork(). В дочернем процессе, которому fork() возвращает 0, мы выполняем вызов execvp(). Первый параметр execvp() – значение argv[1], в котором должно быть передано имя запускаемой программы. В качестве второго параметра функции передается массив аргументов командной строки, полученных программой exec, начиная со второго элемента (элемент argv[1]). Например, если список аргументов программы exec имел вид "exec", "ls", "-al", то первым параметром функции execvp() будет строка "ls", а вторым параметром – массив из двух строк "ls" и "-al" (не забывайте, что первым элементом массива аргументов командной строки должно быть имя самой программы, по которому она была вызвана). Таким образом, вы можете, например, давать команды




Содержание  Назад  Вперед