Системные вызовы Linuxapi по работе с процессами




НазваниеСистемные вызовы Linuxapi по работе с процессами
Дата публикации09.10.2014
Размер63.7 Kb.
ТипЛабораторная работа
shkolnie.ru > География > Лабораторная работа
Лабораторная работа N 2

Системные вызовы LinuxAPI по работе с процессами
Задание:

  1. Изучить правила использования системных вызовов fork(), wait(), exit().

  2. Ознакомиться с системными вызовами getpid(), getppid().

  3. Изучить средства динамического запуска программ в Linux ( системные вызовы execl(), execv(),...).

  4. Для указанного варианта (последнее число в номере зачетной книжки) составить программу на языке Си, реализующую общее задание.

  5. Выполнить свой вариант и защитить лабораторную работу, ответив на контрольные вопросы.


^ Теоретические предпосылки

Процесс – это фундаментальное понятие ОС семейства Unix. Под процессом понимается программа во время ее выполнения. Процесс является единственной активной сущностью в системе. Процесс - уникальным образом идентифицируемая программа, которая нуждается в получении доступа к ресурсам компьютера.

Каждый процесс запускает одну программу и изначально получает один поток управления. Большинство версий Unix / Linux позволяют процессу после того, как он запущен, создавать дополнительные потоки. Unix / Linux – многозадачная система, так что несколько независимых процессов могут работать одновременно.
В ОС Linux для создания процессов используется системный вызов fork():

#include

#include

pid_t fork (void);

В результате успешного вызова fork() ядро создаёт новый процесс, который является почти точной копией вызывающего процесса. Другими словами, новый процесс выполняет копию той же программы, что и создавший его процесс, при этом все его объекты данных имеют те же самые значения, что и в вызывающем процессе. Созданный процесс называется дочерним процессом, а процесс, осуществивший вызов fork(), называется родительским. После вызова родительский процесс и его вновь созданный потомок выполняются одновременно, при этом оба процесса продолжают выполнение с оператора, который следует сразу же за вызовом fork(). Процессы выполняются в разных адресных пространствах, поэтому прямой доступ к переменным одного процесса из другого процесса невозможен.

Следующая короткая программа более наглядно показывает работу вызова fork() и использование процесса:

#include

#include

int main ()

{

pid_t pid;

printf ("Пока всего один процесс\n");

pid = fork ();

printf ("Уже два процесса\n");

if (pid == 0){

printf ("Это дочерний процесс pid=%d\n", getpid());

printf ("Это pid его Родительского процесса=%d\n", getppid());

}

else if (pid > 0)

printf ("Это родительский процесс pid=%d\n", getpid());

else

printf ("Ошибка вызова fork, потомок не создан\n");

}

Для корректного завершения дочернего процесса в родительском процессе необходимо использовать функцию wait() или waitpid():

pid_t wait(int *status); pid_t waitpid(pid_t pid, int *status, int options);

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

Функция waitpid () приостанавливает выполнение родительского процесса до тех пор, пока дочерний процесс, указанный в параметре pid, не завершит выполнение, или пока не появится сигнал, который либо завершает родительский процесс, либо требует вызвать функцию-обработчик. Если указанный дочерний процесс к моменту вызова функции уже завершился (так называемый «зомби»), то функция немедленно возвращается. Системные ресурсы, связанные с дочерним процессом, освобождаются. Параметр pid может принимать несколько значений:

pid< -1 означает, что нужно ждать любого дочернего процесса, чей идентификатор группы процессов равен абсолютному значению pid.

pid= -1 означает ожидать любого дочернего процесса; функция wait ведет себя точно так же.

pid = 0 означает ожидать любого дочернего процесса, чей идентификатор группы процессов равен таковому у текущего процесса.

pid> 0 означает ожидать дочернего процесса, чем идентификатор равен pid.

Значение options создается путем битовой операции ^ ИЛИ над следующими константами:

WNOHANG - означает вернуть управление немедленно, если ни один дочерний процесс не завершил выполнение.

WUNTRACED - означает возвращать управление также для остановленных дочерних процессов, о чьем статусе еще не было сообщено.

Каждый дочерний процесс при завершении работы посылает своему процессу-родителю специальный сигнал ^ SIGCHLD, на который у всех процессов по умолчанию установлена реакция "игнорировать сигнал". Наличие такого сигнала совместно с системным вызовом waitpid() позволяет организовать асинхронный сбор информации о статусе завершившихся порожденных процессов процессом-родителем.

Для перегрузки исполняемой программы можно использовать функции семейства exec. Основное отличие между разными функциями в семействе состоит в способе передачи параметров.

int execl(char *pathname, char *arg0, arg1, ..., argn, NULL);

int execle(char *pathname, char *arg0, arg1, ..., argn, NULL, char **envp);

int execlp(char *pathname, char *arg0, arg1, ..., argn, NULL);

int execlpe(char *pathname, char *arg0, arg1, ..., argn, NULL, char **envp);

int execv(char *pathname, char *argv[]);

int execve(char *pathname, char *argv[],char **envp);

int execvp(char *pathname, char *argv[]);

int execvpe(char *pathname, char *argv[],char **envp);

Пример. Программа в рамках родительского процесса создает дочерний процесс. Дочерний процесс выполняет команду ls. Родительский ждет завершение дочернего и завершается сам.
#include

#include

#include

#include

#include
main ()

{

char * cmnd="/bin/ls";

int pid, status;

pid=fork(); /* Создаем новый процесс */

if (pid== 0)

{

/* Если процесс создан, работаем в рамках дочернего процесса */

execve(cmnd,NULL,NULL); /* Дочерний процесс выполняет команду ls */

perror("execve");

}

else

{

/* Работаем в рамках родительского процесса */

if(wait(&status)== -1) /* Родительский процесс ожидает */

{perror("wait");}

};

exit(0);

}
Основное отличие между разными функциями в семействе состоит в способе передачи параметров. Как видно из рисунка 1, все эти функции выполняют один системный вызов execve.


Рисунок 1 - Дерево семейства вызовов exec
Порядок выполнения работы

1. Изучить теоретическую часть лабораторной работы.

2. Написать программу согласно своему варианту.


^ Варианты заданий

варианта

Постановка задачи

1

Приостановить на 1 с родительский процесс. Выполнить в дочернем процессе один из системных вызовов exec(), передав ему в качестве параметра стандартную программу ls. Аналогично выполнить вызов ls в родительском процессе.

2

Определить в программе глобальную переменную var со значением, равным 1. До выполнения разветвления увеличить на 1 переменную var, причем вывести ее значение, как до увеличения, так и после. В родительском процессе увеличить значение переменной на 3, а в дочернем на 5. Вывести значение переменной до увеличения и после него внутри каждого из процессов. Результат пояснить.

3

Программа порождает через каждые 2 секунды 5 новых процессов. Каждый из этих процессов выводит свой PID и останавливается, сообщая об этом родителю.

4

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


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

  1. Каким образом может быть порожден новый процесс? Какова структура нового процесса?

  2. Если процесс-предок открывает файл, а затем порождает процесс-потомок, а тот, в свою очередь, изменяет положение указателя чтения-записи файла, то изменится ли положение указателя чтения-записи файла процесса-отца?

  3. Что произойдет, если процесс-потомок завершится раньше, чем процесс-предок осуществит системный вызов wait()?

  4. Могут ли родственные процессы разделять общую память?

  5. Каков алгоритм системного вызова fork()?

  6. Какова структура таблиц открытых файлов, файлов и описателей файлов после создания процесса?

  7. Каков алгоритм системного вызова exit()?

  8. Каков алгоритм системного вызова wait()?

  9. В чем разница между различными формами системных вызовов типа exec()?

Похожие:

Системные вызовы Linuxapi по работе с процессами iconСистемные требования
Системные требования: 2 ghz Pentium 4 processor Windows 2000/XP/vista 256 mb ram
Системные вызовы Linuxapi по работе с процессами iconТема: «вич/ТБ. Вызовы и уроки двойной эпидемии»
Проект по контролю спидом в Центральной Азии (caap) и Центрально-Азиатское Управление ООН по наркотикам и преступности (unodc). приглашают...
Системные вызовы Linuxapi по работе с процессами iconСейсмические волны и их измерение
Земли, вызванные естественными причинами (главным образом тектоническими процессами), или (иногда) искусственными процессами (взрывы,...
Системные вызовы Linuxapi по работе с процессами iconВлияние функций контроля на эффективность управления образовательного учреждения
Управление многообразно и существует в самых различных видах. Это может быть техническое управление, государственное управление,...
Системные вызовы Linuxapi по работе с процессами iconПрограмма предусматривает проведение пленарного заседания, круглых...
Приглашаем Вас принять участие в работе Международного конгресса специалистов социальной сферы «Социальная педагогика: вызовы XXI...
Системные вызовы Linuxapi по работе с процессами iconЛабораторная работа. Обмен информацией между процессами с помощью отображаемых в память файлов
Цель работы: изучить возможности применения механизма обмена данными между процессами в операционной системе Windows на основе отображаемых...
Системные вызовы Linuxapi по работе с процессами icon«Ты с нами!»: Системные взгляды и решения для учителей, учеников и родителей
«Ты с нами!»: Системные взгляды и решения для учителей, учеников и родителей / Перев с нем. И. Д. Беляковой. — М.: Институт консультирования...
Системные вызовы Linuxapi по работе с процессами iconСоставитель Гунтхард Вебер практика семейной расстановки системные решения по Берту Хеллингеру
Практика семейной расстановки: Системные решения по Берту Хеллингеру (Составитель Г. Вебер) / Перевод с немецкого И. Д. Бе­ляковой....
Системные вызовы Linuxapi по работе с процессами iconМетодические указания по выполнению и оформлению курсовой работы...
Курсовая работа является завершающим этапом в изучении и закреплении дисциплины «Основы управления логистическими процессами в закупках,...
Системные вызовы Linuxapi по работе с процессами iconРеспубликанский социальный форум
Межсекторное сотрудничество как инструмент реагирования на глобальные вызовы современности
Вы можете разместить ссылку на наш сайт:
Школьные материалы


При копировании материала укажите ссылку © 2014
shkolnie.ru
Главная страница