Хелпикс

Главная

Контакты

Случайная статья





Лабораторная работа 21. ПРОЦЕССЫ В ОПЕРАЦИОННОЙ СИСТЕМЕ LINUX.. Основной и дочерние процессы.. Распределение виртуальной памяти. Задание.



Лабораторная работа 21

ПРОЦЕССЫ В ОПЕРАЦИОННОЙ СИСТЕМЕ LINUX.

Основной и дочерние процессы.

Цель работы:Ознакомиться на практике с процессами  в операционной системе. Linux.

Краткие теоретические сведения

Функция waitpid.

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

Блокирует вызывающий процесс до тех пор, пока не завершится дочерний процесс с PID, заданным в первом параметре. Если pid=-1, то ожидает завершения любого дочернего процесса (как wait). Если задать в options значение WNOHANG, то waitpid работает в неблокирующем режиме(асинхронно): если нет завершившихся дочерних процессов, то управление немедленно возвращается в вызывающий процесс, при этом waitpidвозвращает 0 и устанавливает errno.

Сигнал SIGCHLD. Другой способ получения асинхронного уведомления о завершении дочернего процесса - обработать сигнал SIGCHLD, который ОС посылает родительскому процессу при завершении его потомка.

 

Распределение виртуальной памяти

Каждый процесс имеет свое собственное виртуальное адресное пространство. ОС Linux хранит адреса виртуальной памяти каждого процесса. Эти адреса доступны процессу и могут быть получены из глобальных переменных exent, edata, end .

 

Порядок выполнения работы:

Задание.

1)Выполните программу pr3.c, где основной процесс создает дочерний процесс, завершающийся немедленно. Затем основной процесс "засыпает" на 30 секунд. Запустите программу, и пока она выполняется, из другого окна введите команду

% ps -al

Выпишите и поясните информацию о состоянии обоих процессов. Повторите эту команду после завершения работы программы. Объясните результаты.

/* pr3.c */

#include <stdlib.h>

#include <sys/types.h>

#include <unistd.h>

int main ()

{

pid_t child_pid;

/* Create a child process. */

child_pid = fork ();

if (child_pid > 0) sleep (30);

else exit (0);

return 0;

}

2)Напишите программу pr4.c: в основном процессе напишите функцию-обработчик для сигнала SIGCHLD, которая при помощи функции waitполучает код возврата дочернего процесса функцией и очищает структуры данных, занимаемые этим процессом; записывает код возврата дочернего процесса в некоторую глобальную переменную. Основной процесс создает дочерний процесс (который завершается немедленно и возвращает какой-нибудь код возврата, например, 2), затем основной процесс в цикле выполняет некоторую работу (например, печатает символ на экране и проверяет значение глобальной переменной. После завершения дочернего процесса распечатывает его код возврата. Используйте следующий код для функции-обработчика сигнала и для задания реакции на сигнал SIGCHLD:

#include <signal.h>

#include <string.h>

#include <sys/types.h>

#include <sys/wait.h>

sig_atomic_t exstatus;

void clean_up_child_process (int snumber)

{

int status;

wait (&status);

/* Store its exit status in a global variable. */

exstatus = status;

}

int main ()

{

struct sigaction sigact;

memset (&sigact, 0, sizeof (sigact));

sigact.sa_handler = &clean_up_child_process;

sigaction (SIGCHLD, &sigact, NULL);

...

return 0;

}

Пояснения.

В начале функции main функция sigaction задает действие для сигнала: первый параметр - номер сигнала; второй параметр - указатель на структуру sigaction. Поле sa_handler этой структуры может содержать одно из трех значений:

SIG_DEL - обрабатывать указанный сигнал по умолчанию;

SIG_IGN - игнорировать указанный сигнал;

указатель на функцию-обработчик сигнала, которая принимает номер сигнала и возвращает void.

Обработчик сигнала полностью удаляет дочерний процесс из памяти функцией waitи записывает код возврата в глобальную переменную. Так как обработчик может быть прерван в любом месте, например, поступлением другого сигнала, то присвоение значения глобальной переменной должно быть неделимой (атомарной) операцией. Это обеспечивается использованием для глобальной переменной типа sig_atomic_t, описанного в <sys/types.h>.

Содержание отчета:

Цель работы.

Краткое изложение теории.

В рабочем отчете зафиксировать задание, результат его выполнения.

Сделать выводы по работе.

 



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.