Описание функций

Для загрузки новой программы в системный контекст текущего процесса используется семейство взаимосвязанных функций, отличающихся друг от друга формой представления параметров.

Аргумент file является указателем на имя файла, который должен быть загружен. Аргумент path - это указатель на полный путь к файлу, который должен быть загружен.

Аргументы arg0 и argN представляют собой указатели на аргументы командной строки. Заметим, что аргумент arg0 должен указывать на имя загружаемого файла. Аргумент argv представляет собой массив из указателей на аргументы командной строки. Начальный элемент массива должен указывать на имя загружаемой программы, а заканчиваться массив должен элементом, содержащим указатель NULL.

Системный вызов wait():

Процесс-предок имеет возможность получить информацию о завершении своего потомка. Для этого служит системный вызов wait():

#include <sys/types.h>

#include <sys/wait.h>

pid_t wait(int *status);

При обращении к этому вызову выполнение родительского процесса приостанавливается до тех пор, пока один из его потомков не завершится либо не будет остановлен. Если у процесса имеется несколько потомков, процесс будет ожидать завершения любого из них (т.е., если процесс хочет получить информацию о завершении каждого из своих потомков, он должен несколько раз обратиться к вызову wait()).

Возвращаемым значением wait() будет идентификатор завершенного процесса, а через параметр status будет возвращена информация о причине завершения процесса (завершен путем вызова _ exit(), либо прерван сигналом) и коде возврата.

Если процесс не интересуется этой информацией, он может передать в качестве аргумента вызову wait() NULL -указатель.

Конкретный формат данных, записываемых в параметр status, может различаться в разных реализациях ОС. Во всех современных версиях UNIX определены специальные макросы для извлечения этой информации, например:

макрос WIFEXITED(*status) возвращает ненулевое значение, если процесс был завершен путем вызова _ exit(), при этом макрос WIFEXITED(*status) возвращает статус завершения, переданный через _ exit().

Задание 4.

Написать программу, моделирующую команду Shell. В каждом из процессов используется стандартный ввод/вывод. Аргументы, необходимые программе, задаются в командной строке.

Варианты:

1. Создайте три исполняемых файла: f1,f2. f3, печатающие соответственно: “first”, “second”, “third”. Напишите программу для запуска команды./ file f1 f2 f3.

Объясните полученный результат.

2. Напишите и отладьте программу, в которой процесс-предок порождает два процесса, каждый из которых запускает команду echo c собственным текстом. Предок должен дождаться завершения потомков, после чего продолжить выполнение, завершая свою работу выдачей сообщения “All children terminated\n”.

Объясните работу программы и полученные результаты.

3. Напишите и отладьте программу, запускающую команду отдельной компиляции двух файлов.

/prog f1.c f2.c

Продемонстрируйте работу программы и результаты - корректно сформированные два исполняемых файла: f1.out и f2.out.

В вариантах 4-7:

pri - имена процессов,

argj - аргументы процессов,

f.dat - файл входных данных,

f.rez - файл результатов.

Имена запускаемых процессов и используемых файлов задавать в командной строке

4../pr1<f.dat>f.rez

5../pr1 && pr2

6../pr1 || pr2

7. pr1;pr2;…;prn

Контрольные вопросы

1. Дайте понятие процесса в ОС UNIX, контекста процесса.

2. Какова иерархия процессов в UNIX?

3. Расскажите о создании процессов в UNIX.

4. Какие функции позволяют организовать системный вызов exec() в программе на С в ОС UNIX? Для чего этот вызов предназначен?

5. Объясните общую схему организации различной работы процесса-ребенка и процесса-родителя.

6. Расскажите об аргументах функции main().

7. Как можно корректно организовать работу родительского процесса и его потомков (чтобы родитель дожидался окончания работы потомков)?

8. Объясните структуру: fork() + exec() в ОС UNIX.



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: