КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Запуск внешней программыЗапуск новой программы осуществляется с помощью системного вызова ехес(). При этом новый процесс не порождается, а исполняемый код процесса полностью замещается кодом запускаемой программы. В UNIX запуск на выполнение новой программы часто связан с порождением нового процесса, таким образом сначала процесс выполняет вызов fork, порождая дочерний процесс, который затем выполняет ехес() полностью замещаясь новой программой. После возврата из вызова ехес(2) процесс продолжает выполнение кода новой программы. #include <unistd.h> Int execve(const char**path, const char**argv, const char**envir) Процесс тот же но с другой программой. Пар-р path – задает исполн файл программы, кот нужно запустить вместо текущей. Пар-ры argv и envir – создают команд строку и окружение для запускаемой программы. Если запуск успешный, то ничего не вернет, т.к. уходим в другую программу, если ошибка то вернет -1. Модификации системного вызовова ехес(): Int execv(const char**path, const char**argv[]) здесь окружение для запуска программы наслед из текущей Int execvp(const char**path, const char**argv[]) – отличие в том что имя зад-ся в пар-ре path м.б именем программ-мы, исполн файл которой наход в одной из директорий опред-ных в переменной окружения. Пример: Int execl(const char**path, const char**argv[]) >ls –l Execl(“bin/ls”,”ls”,”-l”,NULL) Int execlp (const char**path, const char**argv[0], const char**argv[1]….,NULL) Все ф-и заменяют в памяти процесса выполн-щуюся программу на другую, указа-ю в пар-рах вызова. Открытые файл дискрипторы при выполнении Exe остаются открытами, что позволяет осущ-ть манипуляцию дескрипторами. Суффиксы l, v, p и e: p - определяет, что функция будет искать дочернюю" программу в директориях, определяемых переменной среды DOS PATH. Без суффикса p поиск будет производиться только в рабочем каталоге. Если параметр path не содержит маршрута, то поиск производится в текущей директории. l - показывает, что адресные указатели (arg0, arg1,..., argn) передаются, как отдельные аргументы. Обычно суффикс l употребляется, когда число передаваемых аргументов заранее известно. v - показывает, что адресные указатели (arg[0],arg[1], ...arg[n]) передаются, как массив указателей. Обычно, суффикс v используется, когда передается переменное число аргументов. e - показывает, что "дочернему" процессу может быть передан аргумент envp, который позволяет выбирать среду "дочернего" процесса. Без суффикса e "дочерний" процесс унаследует среду "родительского" процесса. Пример: Смоделировать команду ls –l –a Main() {int pid; pid=fork(); If (pid==-1) {perror(“osibka fork”);exit(1);} If (pid==0) {execlp(“ls”,”ls”,”-l”,”-a”,NULL);//дочерний проц perror(“error ls”); exit(2);} Wait(NULL); - дождется окончание дочернего процесса и уничтожит зомби Return 0;}
28. Системный вызов Wait. Процессы зомби. Операционная система предоставляет процессу ряд функций, позволяющих ему контролировать выполнение потомков. Это функции Wait: #include <sys/types.h> #include <sys/wait.h> Pid_t wait(int*stat_loc) Pid_t waitpid(pid_t, int*stat_loc, int options); Системный вызов Wait позволяет заблокировать выполнение процесса, пока кто-либо из его непосредственных потомков не прекратит существование. Вызов wait немедленно возвратит идентификатор уже завершившегося дочернего процесса в переменной stat_loc, если процесс в состоянии зомби – то он завершится к моменту wait. Значение stat_loc может быть проанализировано с помощью следующих макроопределений: WERMSIGNALED(status)- сох-ет номер сигнала заверш процесс. Процесс становится «зомби» если он завершился но информация о нем не затребована родительским процессом – поэтому он висит в системе, занимает место в таблице процесса, не имея ни кода, ни данных. Wait затребует инф-цию о зомби и тем самым позволит убрать зомби из системы. Если родит процесс не имеет порожденных процессов, завершение которых он ожидает или был прерван сигналом при выполнении Wait фун-я возвращает значение -1. Фун-я waitpid явл более универсальный по сравнению с Wait. Фун-я waitpid сообщает код завершения и идентификатор дочернего процесса по его завершению. Однако в случае waitpid в вызывающ процессе можно указать завершения какого из поражденных процессов следует ожидать. Пар-р pid<0 указывает кого ждать. Если pid>0 то ждать люб. дочерний. int wait4(int pid, int *status, int options, struct rusage *rusage); Функция wait4 приостанавливает исполнение текущего процесса до того, как свою работу завершит дочерний процесс с номером pid, или этот процесс не получит сигнал, прекращающий его работу. Параметр options состоит из комбинации следующих флагов: WNOHANG- немедленно вернуть управление вызывающему процессу, если нет дочерних процессов, попадающих под действие функции. WUNTRACED- вернуться, если существуют остановленные дочерние процессы, а их статус еще не получен. Если options=0, то обычный wait. Если status не равен NULL, то wait4 сохранят в памяти информацию о процессе в виде структуры status. Wait(NULL) – снимает зомби.
|