Автор: Пользователь скрыл имя, 14 Апреля 2013 в 21:12, курсовая работа
Процесс создаёт дочерний процесс, выполняющий бесконечный цикл, и ожидает 5 сек., после чего посылает дочернему сигнал SIGQUIT. Дочерний процесс должен игнорировать сигналы SIGTSTP и SIGINT.
ВОЕННАЯ АКАДЕМИЯ СВЯЗИ
Кафедра №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()
Алгоритм функции main()
default -1
0
#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_
act_sgqt.sa_handler=get_sgqt;
act_sgnt.sa_mask=act_sgtstp.
act_sgnt.sa_flags=act_sgtstp.
sigaction(SIGINT,&act_sgnt,
sigaction(SIGTSTP,&act_sgtstp,
sigaction(SIGQUIT,&act_sgqt,
while(1) pause();
break;
}
default:
{
sigfillset(&set);
act_sgchld.sa_handler=get_
act_sgchld.sa_mask=set;
act_sgchld.sa_flags=0;
sigaction(SIGCHLD,&act_sgchld,
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);
} } }
Информация о работе Разработка программы запуска и завершения процессов