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

Автор: Пользователь скрыл имя, 14 Апреля 2013 в 21:12, курсовая работа

Описание работы

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

Работа содержит 1 файл

0010563_55F69_razrabotka_programmy_zapuska_i_zaversheniya_processov.doc

— 65.50 Кб (Скачать)

ВОЕННАЯ АКАДЕМИЯ СВЯЗИ

Кафедра №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_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);

} } }


Информация о работе Разработка программы запуска и завершения процессов