Logo GenDocs.ru

Поиск по сайту:  

Загрузка...

Разработка программы запуска и завершения процессов - файл 1.doc


Разработка программы запуска и завершения процессов
скачать (65.5 kb.)

Доступные файлы (1):

1.doc66kb.18.12.2011 17:02скачать

содержание
Загрузка...

1.doc

Реклама MarketGid:
Загрузка...
ВОЕННАЯ АКАДЕМИЯ СВЯЗИ

Кафедра №20

Курсовой проект по дисциплине

«Операционные системы»
Тема: «Разработка программы запуска и завершения процессов»

Вариант № 3.


Выполнил:

курсант группы 4331 =Глухов А.А.=

Проверил:

ст. преподаватель каф.№20 п/п-к =Башаров А. Б.=

Санкт-Петербург

2005г.
1.ЗАДАНИЕ

Процесс создаёт дочерний процесс, выполняющий бесконечный цикл, и ожидает 5 сек., после чего посылает дочернему сигнал SIGQUIT. Дочерний процесс должен игнорировать сигналы SIGTSTP и SIGINT.


^ 2.ПРОГРАММНАЯ РЕАЛИЗАЦИЯ

Новый процесс порождается с помощью системного вызова fork():

#include<sys/types.h>

#include<unistd.h>

pid_t fork(void);

Дочерний процесс выполняет бесконечный цикл:



while(1)

{

pause();

}



Функция pause() приостанавливает работу вызывающего процесса в точке вызова до получения им какого-нибудь сигнала. Родительский процесс ожидает с помощью функции sleep(). Сигналы посылаются с помощью системного вызова kill():

int kill(pid,sig);

Для того, чтобы дочерний процесс игнорировал сигналы SIGTSTP и SIGINT, изменим реакцию дочернего процесса на получение этих сигналов. Модель сигналов основана на понятии набора сигналов (signal set), описываемого переменной типа sigset_t. Функция sigfillset() позволяет управлять набором сигналов:

#include<signal.h>

int sigfillset(sigset_t *set);

После вызова этой функции набор будет включать все сигналы, известные системе. Определим функцию sigaction(), позволяющую установить диспозицию сигналов:

#include<signal.h>

int sigaction(int sig, const struct sigaction *act, struct sigaction *oact);

Погибая, дочерний процесс посылает родительскому сигнал SIGCHLD. В родительском процессе определим обработчик, выводящий сообщение о получении этого сигнала.


^ 3.АЛГОРИТМ РЕШЕНИЯ ЗАДАЧИ


Алгоритм функций get_sgnt(), get_sgtstp(), get_sgchld()





Алгоритм функции get_sgqt()

Exit(1)




Алгоритм функции main()









default -1



0














Установка диспозиции сигналов

Установка диспозиции сигналов





Ждёт 5 сек






Посылает SIGTSTP






Pause()

Посылает SIGINT





Посылает SIGQUIT







#include<stdio.h>

#include<stdlib.h>

#include<sys/types.h>

#include<sys/stat.h>

#include<signal.h>

#include<unistd.h>

void get_sgnt()

{

printf("CHILD: игнорирую SIGINT\n");

}
void get_sgtstp()

{

printf("CHILD: игнорирую SIGTSTP\n");

}
void get_sgqt()

{

printf("CHILD: получен SIGQUIT. Ухожу.\n");

exit(1);

}
void get_sgchld()

{

printf("PARENT: получен SIGCHLD\n");

}
int main()

{

pid_t pid, ppid;

sigset_t set;

struct sigaction act_sgnt, act_sgtstp, act_sgqt, act_sgchld;

printf("Создаём дочерний процесс\n");

switch (pid=fork())

{

case -1:

{

printf("Ошибка fork()!\n");

exit(1);

}

case 0:

{

printf("CHILD: работаю\n");

sigfillset(&set);

act_sgnt.sa_handler=get_sgnt;

act_sgtstp.sa_handler=get_sgtstp;

act_sgqt.sa_handler=get_sgqt;

act_sgnt.sa_mask=act_sgtstp.sa_mask=act_sgqt.sa_mask=set;

act_sgnt.sa_flags=act_sgtstp.sa_flags=act_sgqt.sa_flags=0;

sigaction(SIGINT,&act_sgnt,NULL);

sigaction(SIGTSTP,&act_sgtstp,NULL);

sigaction(SIGQUIT,&act_sgqt,NULL);

while(1) pause();

break;

}

default:

{

sigfillset(&set);

act_sgchld.sa_handler=get_sgchld;

act_sgchld.sa_mask=set;

act_sgchld.sa_flags=0;

sigaction(SIGCHLD,&act_sgchld,NULL);

printf("PARENT: работаю\n");

sleep(5);

printf("PARENT: посылаю SIGTSTP\n");

kill(pid,SIGTSTP);

sleep(2);

printf("PARENT: посылаю SIGINT\n");

kill(pid,SIGINT);

sleep(2);

printf("PARENT: закрываю CHILD\n");

kill(pid,SIGQUIT);

sleep(2);

printf("<Enter> для выхода=> ");

getchar();

printf("PARENT: ухожу\n");

exit(1);

} } }


Скачать файл (65.5 kb.)

Поиск по сайту:  

© gendocs.ru
При копировании укажите ссылку.
обратиться к администрации