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

33. Cтандартный ввод стандартный вывод и стандартный вывод диагностики.

ОС UNIX автоматически для каждой программы открывает 3 дескриптора

(0-ст.ввод) (1-ст.вывод)(2-ст.вывод диагностики)

Юникс позволяет перенаправлять стандартный ввод и вывод данных на на файловую систему.

$prog1<infile

$prog1>outfile

$prog1| prog2

Программа копирования стандартного ввода в стандартный вывод

#include<stdlib.h>

#include<urstd.h>

#include size 512

Main()

{

Size_t uread;

Char buf[size];

While(nread=read(0,buf,size))>0;

Write(1,buf,nread)

Exit(0)

}

31. Очереди сообщения в unix

Очереди сообщений поддерживаются ядром UNIX.

У каждого сообщения есть тип – идентификатор, который присваивается процессом-отправителем. Используя этот тип, процессы могут получать только нужные сообщения.

В области ядра имеется таблица очереди сообщений. Каждая запись таблицы очередей характеризует конкретную очередь сообщений и содержит следующую информацию:

Имя очереди – целочисленный идентификатор. Присваивается процессом, который создаёт очередь. Другие процессы, используя этот ключ, могут открывать очередь и получать к ней доступ.

Идентификатор владельца (UID) и идентификатор группы (GID).

UID и GID владельца очереди.

Права доступа к очереди.

Время и идентификатор процесса, который последним передал сообщение в очередь.

Время и идентификатор процесса получившего последним сообщение из очереди.

Указатель на связный список записей сообщений, находящихся в очереди. Каждая запись в очереди сообщений содержит:

Тип сообщения.

Число байт данных.

Указатель на область данных ядра, где находятся сами сообщения.

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

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

Процесс может выбрать сообщение из очереди следующим образом:

самое старое.

указанного типа.

числовое значение которого наименьшее из меньших или равных значению типа, указанного процессом.

Очереди сообщений указываются с помощью положительного числа, называемого (идентификатором очереди сообщений msqid). У каждой очереди существует структура struct msquid_ds, определенная в <sys/msg.h>,

FTOK - преобразовывает имя файла и идентификатор проекта в ключ для системных вызовов. Функция ftok использует файл с именем pathname (которое должно указывать на существующий файл к которому есть доступ) и младшие 8 бит proj_id (который должен быть отличен от нуля) для создания ключа с типом key_t, используемого в System V IPC для работы с msgget(), semget(), и shmget().

MSGCTL - выполняет контрольные операции над сообщениями . Эта функция выполняет контрольную операцию, заданную в cmd, над очередью сообщений msqid.

MSGGET - получает идентификатор очереди сообщений. Эта функция возвращает идентификатор очереди сообщений, связанный со значением параметра key.Она также создает новую очередь сообщений, если key равен IPC_PRIVATE ; в случае если key не равен IPC_PRIVATE,то с параметром key не сопоставлена ни одна существующая очередь сообщений и в поле msgflg включен флаг IPC_CREAT . (т.е., значение msgflg&IPC_CREAT не равно нулю). Поля IPC_CREAT и IPC_EXCL в msgflg играют ту же роль для очередей сообщений, что и O_CREAT и O_EXCL в параметре mode системной функции open(): функция msgget вернет ошибку, если в msgflg включены оба флага: IPC_CREAT и IPC_EXCL ,- а такая очередь сообщений для key уже существует.

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

struct msgbu { long mtype;/* тип сообщения должен быть > 0 */ char mtext[1];/* содержимое сообщения */ };

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