Неименованные каналы
Неименованные каналы
Применяются только при взаимодействии между процессом и его потомком.
Создается дескриптор, состоящий из двух элементов:
Командой pipe (fdp) он определяется.
pipe - создание неименованного канала
int pipe (fildes)
int fildes [2];
Системный вызов pipe создает механизм ввода/вывода, называемый каналом, и возвращает два дескриптора файла fildes[0] и fildes[1]. Дескриптор fildes[0] открыт на чтение, дескриптор fildes[1] - на запись.
Рекомендуемые материалы
Канал буферизует до 5120 байт данных; запись в него большего количества информации без считывания приведет к блокированию пишущего процесса. Посредством дескриптора fildes[0] информация читается в том же порядке, в каком она записывалась с помощью дескриптора fildes[1].
Системный вызов pipe завершается неудачей, если выполнено хотя бы одно из следующих условий:
1) Превышается максимально допустимое количество файлов, открытых одновременно в одном процессе.
2) Переполнена системная таблица файлов.
При успешном завершении результат равен 0; в случае ошибки возвращается -1, а переменной errno присваивается код ошибки.
Использовать один канал для двух сторон обмена неудобно. Взаимодействуют только родственные каналы.
Если используется один канал, сделать запись в него, а потом прочитать то, что только что было в него записано. Для двустороннего взаимодействия можно создать второй канал.
Пример:
Записывать будем с помощью write (fdp [1]);
Читать с помощью read (fdp [0]).
main ()
{ char buf [2];
int to [2], from [2];
buf [1] = ‘ ’; //конец строки
pipe (to); pipe (from);
if (fork()) //родитель
{ signal (SIGCHLD, kid);
while(1)
{ scanf (‘%c’, &buf [0]);
write (to [1], buf, 2);
read (from [0], buf, 2);
printf (‘%s’, buf);
}}
else //порожденный
{ while(1)
{ read (to [0], buf, 2);
if (buf [0] == ‘e’) exit(0);
buf [0]++;
Бесплатная лекция: "Лекция 4 - Вычисление Z-передаточных функций" также доступна.
write (from [1], buf, 2);
}}}
void kid()
{ wait (0);
exit (0); //завершение в родит. процесс
}