Администрирование локальных сетей
| Категория реферата: Рефераты по информатике, программированию
| Теги реферата: реферат по культурологии, доклад по биологии
| Добавил(а) на сайт: Tolkachjov.
Предыдущая страница реферата | 12 13 14 15 16 17 18 19 20 21 22 | Следующая страница реферата
Тогда при получении сигнала sig будет вызвана функция fr, в которую в качестве аргумента системой будет передан номер сигнала, действительно вызвавшего ее gotsig==sig. Это полезно, т.к. можно задать одну и ту же функцию в качестве реакции для нескольких сигналов:
... signal (sig1, fr); signal(sig2, fr); ...
После возврата из функции fr() программа продолжится с прерванного места.
Перед вызовом функции-обработчика реакция автоматически сбрасывается в реакцию по умолчанию SIG_DFL, а после выхода из обработчика снова восстанавливается в fr. Это значит, что во время работы функции- обработчика может прийти сигнал, который убьет программу.
Приведем список некоторых сигналов; полное описание посмотрите в
документации. Колонки таблицы: G - может быть перехвачен; D - по умолчанию
убивает процесс (k), игнорируется (i); C - образуется дамп памяти процесса:
файл core, который затем может быть исследован отладчиком adb; F - реакция
на сигнал сбрасывается; S - посылается обычно системой, а не явно. сигнал G D C F S смысл
SIGTERM + k - + - завершить процесс
SIGKILL - k - + - убить процесс
SIGINT + k - + - прерывание с клавиш
SIGQUIT + k + + - прерывание с клавиш
SIGALRM + k - + + будильник
SIGILL + k + - + запрещенная команда
SIGBUS + k + + + обращение по неверному
SIGSEGV + k + + + адресу
SIGUSR1, USR2 + i - + - пользовательские
SIGCLD + i - + + смерть потомка
Сигнал SIGILL используется иногда для эмуляции команд с плавающей точкой, что происходит примерно так: при обнаружении "запрещенной" команды для
отсутствующего процессора "плавающей" арифметики аппаратура дает прерывание
и система посылает процессу сигнал SIGILL. По сигналу вызывается функция-
эмулятор плавающей арифметики (подключаемая к выполняемому файлу
автоматически), которая и обрабатывает требуемую команду. Это может
происходить много раз, именно поэтому реакция на этот сигнал не
сбрасывается.
SIGALRM посылается в результате его заказа вызовом alarm() (см. ниже).
Сигнал SIGCLD посылается процессу-родителю при выполнении процессом-
потомком сисвызова exit (или при смерти вследствие получения сигнала).
Обычно процессродитель при получении такого сигнала (если он его заказывал)
реагирует, выполняя в обработчике сигнала вызов wait (см. ниже). По-
умолчанию этот сигнал игнорируется.
Реакция SIG_IGN не сбрасывается в SIG_DFL при приходе сигнала, т.е. сигнал
игнорируется постоянно.
Вызов signal возвращает старое значение реакции, которое может быть
запомнено в переменную вида void (*f)(); а потом восстановлено.
Синхронное ожидание (сисвызов) может иногда быть прервано асинхронным
событием (сигналом), но об этом ниже.
Деления просесса
Системный вызов fork() (вилка) создает новый процесс: копию процесса, издавшего вызов. Отличие этих процессов состоит только в возвращаемом fork- ом значении:
0 - в новом процессе. pid нового процесса - в исходном.
Вызов fork может завершиться неудачей если таблица процессов переполнена.
Простейший способ сделать это: main(){ while(1) if( ! fork()) pause();
}
Одно гнездо таблицы процессов зарезервировано - его может использовать
только суперпользователь (в целях жизнеспособности системы: хотя бы для
того, чтобы запустить программу, убивающую все эти процессы-варвары).
Пайпы и FIFO-файлы.
Процессы могут обмениваться между собой информацией через файлы. Существуют
файлы с необычным поведением - так называемые FIFO-файлы (first in, first
out), ведущие себя подобно очереди. У них указатели чтения и записи
разделены. Работа с таким файлом напоминает проталкивание шаров через трубу
- с одного конца мы вталкиваем данные, с другого конца - вынимаем их.
Операция чтения из пустой "трубы" проиостановит вызов read (и издавший его
процесс) до тех пор, пока кто-нибудь не запишет в FIFOфайл какие-нибудь
данные. Операция позиционирования указателя - lseek() - неприме- нима к
FIFO-файлам. FIFO-файл создается системным вызовом
#include
#include mknod( имяФайла, S_IFIFO | 0666, 0 );
где 0666 - коды доступа к файлу. При помощи FIFO-файла могут общаться даже
неродственные процессы.
Разновидностью FIFO-файла является безымянный FIFO-файл, предназначенный
для обмена информацией между процессом-отцом и процессом-сыном. Такой файл
- канал связи как раз и называется термином "труба" или pipe. Он создается
вызовом pipe: int conn[2]; pipe(conn);
Если бы файл-труба имел имя PIPEFILE, то вызов pipe можно было бы описать
как mknod("PIPEFILE", S_IFIFO | 0600, 0); conn[0] = open("PIPEFILE", O_RDONLY); conn[1] = open("PIPEFILE", O_WRONLY); unlink("PIPEFILE");
При вызове fork каждому из двух процессов достанется в наследство пара
дескрипторов: pipe(conn); fork();
conn[0]---------conn[0] процесс A процесс B
Пусть процесс A будет посылать информацию в процесс B. Тогда процесс A
сделает: close(conn[0]);
// т.к. не собирается ничего читать write(conn[1], ... ); а процесс B close(conn[1]);
// т.к. не собирается ничего писать read (conn[0], ... );
Получаем в итоге: conn[1]---->----FIFO---->-----conn[0] процесс A процесс B
Обычно поступают еще более элегантно, перенаправляя стандартный вывод A в
канал conn[1] dup2 (conn[1], 1); close(conn[1]); write(1, ... ); /* или printf */
а стандартный ввод B - из канала conn[0] dup2(conn[0], 0); close(conn[0]); read(0, ... ); /* или gets */
Это соответствует конструкции
Рекомендуем скачать другие рефераты по теме: бесплатные тесты бесплатно, рефераты по медицине.
Категории:
Предыдущая страница реферата | 12 13 14 15 16 17 18 19 20 21 22 | Следующая страница реферата