Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Psp_bilety_ekzamen.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
142.82 Кб
Скачать

3 Билет

1.Обработка Сигнала

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

Библиотека GNU C определяет ряд типов сигналов, каждый для конкретного вида события. Некоторые виды событий делают нецелесообразным или невозможным обычное продолжение программы, и соответствующие сигналы обычно прерывают программу. Другие виды сигналов сообщают о безобидных событиях, и игнорируются по умолчанию.

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

В заключение нужно сказать, что один процесс может посылать сигнал другому процессу; это позволяет родительскому процессу прерывать дочерние, или сообщаться и синхронизироваться двум связанным процессам.

2) Группы процессов

В течение своего жизненного цикла проект проходит через пять основных фаз:

Инициация - начало работ по проекту. Короткий этап, ставящий своей целью дать ответ на вопрос: стоит ли открывать проект

Планирование - определение содержания проекта и ресурсов, необходимых для его выполнения

Исполнение - проведение работ по проекту

Мониторинг и контроль - управление работами проекта, проверка работ на соответствие плану проекта

Закрытие - завершение работ по проекту, получение формального подтверждения закрытия от заказчика, формализация опыта, полученного в ходе проекта. Разумеется, в эти пять фаз входит гораздо больше, чем написано выше, здесь затронуты только основные положения. Более подробно об этом рассказано на соответствующих страницах

3)Примеры

Основная Обработка сигналов

Функция signal обеспечивает простой интерфейс для установки действия для специфического сигнала.

Функция и связанные макрокоманды объявлены в заголовочном файле "signal.h ".sighandler_t (тип данных)

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

void handler (int signum) { . . . }

Имя sighandler_t для этого типа данных - расширение GNU. sighandler_t signal (int signum, sighandler_t action) (функция)

Функция signal устанавливает action как действие для сигнала signum.

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

Второй аргумент, action, определяет действие используемое для сигнала signum. Оно может быть одно из следующих: SIG_DFL определяет заданное по умолчанию действие для специфического сигнала. Заданные по умолчанию действия для различных видов сигналов SIG_IGN определяет, что сигнал должен игнорироваться. Ваша программа вообще не должна игнорировать сигналы, которые представляют серьезные события, или обычно используется, чтобы запросить окончание. Вы не можете игнорировать SIGKILL или SIGSTOP вообще. Вы можете игнорировать сигналы ошибки в программе подобно SIGSEGV, но игнорирование ошибки не будет давать возможность программе продолжить осмысленное выполнение. Игнорирование запросов пользователя типа SIGINT, SIGQUIT, и SIGTSTP некультурно!!.

Когда Вы не желаете, чтобы сигналы были передан в некоторую части программы, нужно блокировать их, а не игнорировать. handler обеспечивает адрес функции обработчика в вашей программе, выполнение этого обработчика определяется как способ передать сигнал.

Для получения более подробной информации относительно функции­ обработчика сигнала.

Функция signal возвращает action, который был задан для указанного signum. Вы можете сохранять это значение и восстанавливать его позже, вызывая signal снова.

Если signal не может выполнить запрос, она возвращает SIG_ERR. Следующие errno условия ошибки определены для этой функции:

EINVAL

Вы определили недопустимый signum; или Вы пробовали игнорировать или обеспечивать обработчик для SIGKILL или SIGSTOP.

Вот простой пример установки обработчика, чтобы удалить временные файлы, при получении некоторых фатальных сигналов:

#include <signal.h>

void

termination_handler (int signum)

{

struct temp_file *p;

for (p = temp_file_list; p; p = p->next)

unlink (p->name);

}

int

main (void)

{

. . .

if (signal (SIGINT, termination_handler)

== SIG_IGN)

signal (SIGINT, SIG_IGN);

if (signal (SIGHUP, termination_handler)

== SIG_IGN)

signal (SIGHUP, SIG_IGN);

if (signal (SIGTERM, termination_handler)

== SIG_IGN)

signal (SIGTERM, SIG_IGN);

. . .

}

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

Мы не обрабатываем SIGQUIT или сигналы ошибки в программе в этом примере, потому что они разработаны, чтобы обеспечить информацию для отладки (core-файл), и временные файлы могут давать полезную информацию.

sighandler_t ssignal (int signum, sighandler_t action) (функция)

Функция ssignal делает ту же самую вещь что signal; она предоставляется только для совместимости с SVID.

sighandler_t SIG_ERR (макрос)

Значение этой макрокоманды используется как возвращаемое значение из signal, чтобы указать ошибку.

Идентификатор группы процессов – пример

#include <sys/types.h>

#include <unistd.h>

#include <stdlib.h>

#include <stdio.h>

#define NUMCHILD 3

main()

{

int i;

printf("[%ld] Original process group id: %ld\n",

getpid(), getpgid(0));

if (setpgid(0, 0) == -1) {

perror("");

exit(1);

}

printf("[%ld] New process group id: %ld\n",

getpid(), getpgid(0));

for (i = 0; i < NUMCHILD; i++ ) {

if (fork() == 0) { /* child */

printf("\n\t[%ld] Process group id: %ld\n",

getpid(), getpgid(0));

exit(0);

}

}

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]