Руководство программиста для Linux

    778b1c86   

Создание каналов на Си


Создание каналов на языке программирования Си может оказаться чуть более сложным, чем наш простенький shell-пример. Чтобы создать простой канал на Си, мы прибегаем к использованию системного вызова pipe(). Для него требуется единственный аргумент, который является массивом из двух целых (integer), и, в случае успеха, массив будет содержать два новых файловых дескриптора, которые будут использованы для канала. После создания канала процесс обычно порождает новый процесс (вспомним, что процесс-потомок наследует открытые файловые дескрипторы). SYSTEM CALL: pipe(); PROTOTYPE: int pipe( int fd[2] ); RETURNS: 0 в случае успеха -1 в случае ошибки: errno = EMFILE (нет свободных дескрипторов) EMFILE (системная файловая таблица переполнена) EFAULT (массив fd некорректен) NOTES: fd[0] устанавливается для чтения, fd[1] - для записи.

Первое целое в массиве (элемент 0) установлено и открыто для чтения, в то время как второе целое (элемент 1) установлено и открыто для записи. Наглядно говоря, вывод fd1 становится вводом для fd0. Еще раз отметим, что все данные, проходящие через канал, перемещаются через ядро. #include #include #include main() { int fd[2]; pipe(fd); . . }

Вспомните, что имя массива decays в указатель на его первый член. fd - это эквивалент &fd[0]. Раз мы установили канал, то ответвим нашего нового потомка: #include #include #include main() { int fd[2]; pid_t childpid; pipe(fd); if((childpid = fork()) == -1) { perror("fork"); exit(1); } . . }

Если родитель хочет получить данные от потомка, то он должен закрыть fd1, а потомок должен закрыть fd0. Если родитель хочет послать данные потомку, то он должен закрыть fd0, а потомок - fd1. С тех пор как родитель и потомок делят между собой дескрипторы, мы должны всегда быть уверены, что не используемый нами в данный момент конец канала закрыт; EOF никогда не будет возвращен, если ненужные концы канала не закрыты. #include #include #include main() { int fd[2]; pid_t childpid;



Содержание раздела