pipe
1. pipe.2.man
Manpage of PIPE
PIPE
Section: Руководство программиста Linux (2)Updated: 2010-09-10
Index Return to Main Contents
ИМЯ
pipe, pipe2 - создаёт каналОБЗОР
#include <unistd.h> int pipe(int pipefd[2]); #define _GNU_SOURCE /* Смотрите feature_test_macros(7) */ #include <unistd.h> int pipe2(int pipefd[2], int flags);
ОПИСАНИЕ
pipe() создаёт однонаправленный канал данных, который можно использовать для взаимодействия между процессами. Массив pipefd используется для возврата двух файловых описателей, указывающих на концы канала. pipefd[0] указывает на конец канала для чтения. pipefd[1] указывает на конец канала для записи. Данные, записанные в конец канала, буферизируются ядром до тех пор, пока не будут прочитаны из конца канала для чтения. Подробней см. pipe(7).Если flags равно 0, то pipe2() выполняет то же что и pipe(). Следующие значения могут быть побитово сложены в flags для получения различного поведения:
- O_NONBLOCK
- Устанавливает флаг состояния файла O_NONBLOCK для двух новых открытых файловых дескрипторов. Использование данного флага заменяет дополнительные вызовы fcntl(2) для достижения того же результата.
- O_CLOEXEC
- Устанавливает флаг close-on-exec (FD_CLOEXEC) для двух новых открытых файловых дескрипторов. Смотрите описание того же флага в open(2) для того, чтобы узнать как это может пригодиться.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении возвращается 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.ОШИБКИ
- EFAULT
- pipefd задан некорректно.
- EINVAL
- (pipe2()) Некорректное значение flags.
- EMFILE
- Процесс открыл слишком много файловых дескрипторов.
- ENFILE
- Достигнуто максимальное количество открытых файлов в системе.
ВЕРСИИ
Вызов pipe2() был добавлен в Linux начиная с версии 2.6.27; поддержка в glibc появилась начиная с версии 2.9.СООТВЕТСТВИЕ СТАНДАРТАМ
pipe(): POSIX.1-2001.Вызов pipe2() есть только в Linux.
ПРИМЕР
Следующая программа создаёт канал, и затем выполняет fork(2) для создания потомка; потомок наследует скопированный набор файловых дескрипторов, которые указывают на тот же канал. После fork(2) каждый процесс закрывает дескрипторы, которые ненужны каналу (см. pipe(7)). Затем родитель записывает строку, переданную в качестве аргумента командной строки, в канал, а потомок читает эту строку из канала по байту за раз, и выводит её на стандартный вывод.#include <sys/wait.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> int main(int argc, char *argv[]) { int pipefd[2]; pid_t cpid; char buf; if (argc != 2) { fprintf(stderr, "Использование: %s <строка>
", argv[0]); exit(EXIT_FAILURE); } if (pipe(pipefd) == -1) { perror("pipe"); exit(EXIT_FAILURE); } cpid = fork(); if (cpid == -1) { perror("fork"); exit(EXIT_FAILURE); } if (cpid == 0) { /* Потомок читает из канала */ close(pipefd[1]); /* Закрывает неиспользуемый конец для записи */ while (read(pipefd[0], &buf, 1) > 0) write(STDOUT_FILENO, &buf, 1); write(STDOUT_FILENO, "
", 1); close(pipefd[0]); _exit(EXIT_SUCCESS); } else { /* Родитель пишет значение argv[1] в канал */ close(pipefd[0]); /* Закрывает неиспользуемый конец для чтения */ write(pipefd[1], argv[1], strlen(argv[1])); close(pipefd[1]); /* Читатель видит EOF */ wait(NULL); /* Ожидание потомка */ exit(EXIT_SUCCESS); } }
СМОТРИТЕ ТАКЖЕ
fork(2), read(2), socketpair(2), write(2), popen(3), pipe(7)
Index
- ИМЯ
- ОБЗОР
- ОПИСАНИЕ
- ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
- ОШИБКИ
- ВЕРСИИ
- СООТВЕТСТВИЕ СТАНДАРТАМ
- ПРИМЕР
- СМОТРИТЕ ТАКЖЕ
This document was created by man2html using the manual pages.
Time: 17:41:53 GMT, May 11, 2012



