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

21. Переназначение стандартного ввода/вывода.

- stdin;

- stdout;

- stderr.

Часто возникают ситуации, когда в некоторм модуле, который подключается, используются стандартные потоки ввода-вывода. А исходный модуль использует передачу данных с помощью каналов.

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

Достигнем этого с помощью системных вызовов:

1) close(0) - закрывает стандартный ввод.

2) dup(p[0]) – наименьший доступный дескриптор файла и конец канала р для ввода становится синонимами.

3) close(p[0]) – дескриптор закрывается, так как ни один процесс не будет читать из канала р.

После этого для работы с каналом могут использоваться стандартные функции scanf, printf и другие.

23. Программные каналы как средство синхронизации процессов.

Канал – однолинейное сонхронное средство связи, которое используется для обмена данными (двумя процессами), а также для синхронизации друг друга.

Канал имеет один конец для записи данных и другой для чтения.

Канал – своеобразный файл, который имеет два дескриптора:

один – для записи в канал;

другой – для чтения из канала.

Синхронизация процессов с помощью каналов происходит в виду их свойств:

1) попытка записать данние в полный канал приводит к приостановке записи до тех пор, пока другой процесс не считает данние из канала, тем самым освободив его.

2) попытка чтения данных из пустого канала приводит к приостановке процесса до тех пор, пока другой процесс не заполнит канал данными.

22.Использование канала fifo

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

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

1. При чтении меньшего числа байтов, чем находится в канале илиFIFO, возвращается требуемое число байтов, остаток сохраняется дляпоследующих чтений.

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

3. Если канал пуст и ни один процесс не открыл его на запись, при чтении из канала будет получено 0 байтов. Если один или более процессов открыли канал для записи, вызов будет заблокирован допоявления данных

4. Запись числа байтов, меньшего емкости канала или FIFO, гарантированно атомарно. Это означает, что в случае, когда несколько процессов одновременно записывают в канал, порции данных от этих процессов не перемешиваются.

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

mkfifo - создает особый FIFO-файл (именованный канал)

24.Сигналы в unix

Сигналы посылаются процессу с целью сообщения о возникновении каких-то асинхронных событий.

Сигналы посылаются процессу либо:

- ядром

- от другого процесса, с помощью системного вызова kill.

Сигналы деляться на группы:

1) сигналы, посылаемые в случае завершении процесса

2) сигналы, посылаемые в случае возникновения особых ситуаций (обращение к адресу за педлами доступной памяти)

3) сигналы, посылаемые во время выполнения системной функции (к несуществующей функции).

signal - работа с сигналами ANSI C

СИНТАКСИС

#include <signal.h>

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

ОПИСАНИЕ

Системный вызов signal() устанавливает новый обработчик сигнала с номером signum в соответствии с параметром sighandler, который может быть функцией пользователя, SIG_IGN или SIG_DFL. При получении процессом сигнала с номером signum происходит следующее: если устанавливаемое значение обработчика равно SIG_IGN, то сигнал игнорируется; если оно равно SIG_DFL, то выполняются стандартные действия, связанные с сигналом. Наконец, если обработчик установлен в функцию sighandler, то сначала устанавливает значение обработчика в SIG_DFL или выполняется зависимая от реализации блокировка сигнала, а затем вызывается функция sighandler с параметром signum.

Использование функции-обработчика сигнала называется "перехватом сигнала". Сигналы SIGKILL и SIGSTOP не могут быть "перехвачены" или игнорированы.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

Функция signal() возвращает предыдущее значение обработчика сигнала или SIG_ERR при ошибке.

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