- •Содержание
- •1. Теоретическая часть
- •1.1 Процессы. Создание процессов – функция fork()
- •1.2 Передача управления: execve()
- •1.3 Семейство exec().
- •1.4 Ожидание процесса wait().
- •1.5 Межпроцессорное взаимодействие, каналы( pipe() ).
- •2. Описание базовых программ
- •3. Список заданий
- •I. К части 1 (программа 2.1)
- •II . По части номер 2(программа 2)
- •III. По части номер 3(программа 3)
- •Список использованной литературы.
1.2 Передача управления: execve()
Системный вызов execve() загружает в процесс другую программу и передает ей безвозвратное управление. Этот системный вызов объявлен в заголовочном файле unistd.h следующим образом:
int execve (const char * PATH, const char ** ARGV, const char ** ENVP);
Системный вызов execve() принимает три аргумента:
PATH – это путь исполняемому файлу программы, которая будет запускаться внутри процесса. Здесь следует учитывать, что одноименная переменная окружения в системном вызове execve() не используется. В результате ответственность за поиск программы возложена только на программиста.
ARGV – Это аргументы командной строки.
ENVP – окружение для использования новым процессом, этот массив должен заканчиваться элементом NULL.
Выполняющийся внутри процесса код называется образом процесса. Системный вызов execve() заменяет текущий образ процесса на новый. Следовательно, возврата в исходную программу не происходит. В случае ошибки execve() возвращает -1, но если новая программа начала выполнятся, то execve() уже ничего не вернет, поскольку работа исходной программы, в текущем процессе заканчивается. Возврат из системного вызова execve() происходит только в том случае, если произошла ошибка.
Листинг 1.4 execve.c
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
extern char ** environ;
int main()
{
pid_t result;
char *calc_args[] = {"+","5","10",NULL};
result = fork();
if (result == -1)
{
fprintf(stderr,"fork error\n");
return 1;
}
if (result == 0){
execve("./calc",calc_args,environ);
fprintf(stderr,"execve error\n");
return 1;
} else
sleep(1);
printf(“I’m parent whit PID = %d\n”,getpid()); return 0;
}
Листинг 1.5 calc.c
#include<stdio.h>
int main(int argc, char *argv[]){
int res;
int a;
int b;
printf("argc = %d\n",argc);
printf(" %s ",argv[1]);
printf(" %s ",argv[0]);
printf(" %s =",argv[2]);
a = atoi(argv[1]);
b = atoi(argv[2]);
res = a + b;
printf(" %d\n",res);
return 0;
}
1.3 Семейство exec().
В стандартной библиотеке языка С есть пять дополнительных функций, которые реализованы с использованием execve() и вместе называются семейством exec(). Все функции семейства exec() объявлены в заголовочном файле unistd.h следующим образом:
int execl (const char * PATH, const char * ARG, … );
int execle (const char * PATH, const char * ARG, … , const char ** ENVP );
int execlp (const char * PATH, const char * ARG, … );
int execlv(const char * PATH, const char ** ARG);
int execvp (const char * FILE, const char ** ARG);
Системный вызов execve() является “лидером” и полноправным членом семейства exec().
Таблица 1. Назначение символов в имени exec().
Символ |
Наличие или отсутствие |
Комментарий |
l |
Есть |
Аргументы программы передаются не в виде массива ARGV, а виде отдельных аргументов функции exec(), список которых заканчивается аргументом NULL |
Нет |
Набор аргументов запускаемой программы передается в виде массива строк ARGV |
|
v |
Есть |
Аргументы программы передаются в виде единого массива строк ARGV, последним элементом которого является NULL |
Нет |
Вместо “v” присутствует символ “l”, который задает список программы в виде отдельных аргументов- строк, список которых заканчивается аргументом NULL. |
|
e |
Есть |
В качестве последнего аргумента используется массив строк ENVP(окружение будущей программы). |
Нет |
Начальным окружением будущей программы будет окружение текущего процесса. |
|
p |
Есть |
В качестве первого аргумента используется имя исполняемого файла программы, поиск которого будет производится в каталогах, перечисленных в переменной окружения PATH. |
Нет |
В качестве первого аргумента выступает полный путь к исполняемому файлу программы (относительно текущего и корневого каталога). |