pipe(7) Miscellaneous Information Manual pipe(7) pipe - FIFO FIFO ( ) . (read end) (write end). , , . pipe(2), , , . ; pipe(2). FIFO ( First In First Out, , ) ( mkfifo(3)), open(2). FIFO, . O_RDONLY; O_WRONLY. fifo(7). : FIFO , - FIFO ( ). - FIFO FIFO . , - FIFO . If a process attempts to read from an empty pipe, then read(2) will block until data is available. If a process attempts to write to a full pipe (see below), then write(2) blocks until sufficient data has been read from the pipe to allow the write to complete. Nonblocking I/O is possible by using the fcntl(2) F_SETFL operation to enable the O_NONBLOCK open file status flag or by opening a fifo(7) with O_NONBLOCK. If any process has the pipe open for writing, reads fail with EAGAIN; otherwise--with no potential writers--reads succeed and return empty. , , : - . , , , read(2) (read(2) 0). , , , write(2) SIGPIPE, . , write(2) EPIPE. , pipe(2) fork(2), close(2) ; SIGPIPE/EPIPE . lseek(2). . , write(2) , O_NONBLOCK ( ). . : , , . Before Linux 2.6.11, the capacity of a pipe was the same as the system page size (e.g., 4096 bytes on i386). Since Linux 2.6.11, the pipe capacity is 16 pages (i.e., 65,536 bytes in a system with a page size of 4096 bytes). Since Linux 2.6.35, the default pipe capacity is 16 pages, but the capacity can be queried and set using the fcntl(2) F_GETPIPE_SZ and F_SETPIPE_SZ operations. See fcntl(2) for more information. ioctl(2), , , int, : ioctl(fd, FIONREAD, &nbytes); FIONREAD , . /proc Linux : /proc/sys/fs/pipe-max-pages ( Linux 2.6.34) ( ) , ( CAP_SYS_RESOURCE) . 16 ( ); 2 . Linux 2.6.35; /proc/sys/fs/pipe-max-size. /proc/sys/fs/pipe-max-size ( Linux 2.6.35) ( ) , CAP_SYS_RESOURCE. , , , , . , . 1048576 (1 ). . write(2) EINVAL. Linux 4.9 FIFO. /proc/sys/fs/pipe-user-pages-hard ( Linux 4.5) ( ) (. ., CAP_SYS_RESOURCE CAP_SYS_ADMIN). , , , , . ( ), . /proc/sys/fs/pipe-user-pages-soft ( Linux 4.5) ( ) (. ., CAP_SYS_RESOURCE CAP_SYS_ADMIN). , , , , , , . , . 16384, 1024 . Linux 4.9 , pipe-user-pages-soft pipe-user-pages-hard; . PIPE_BUF POSIX.1 says that writes of less than PIPE_BUF bytes must be atomic: the output data is written to the pipe as a contiguous sequence. Writes of more than PIPE_BUF bytes may be nonatomic: the kernel may interleave the data with data written by other processes. POSIX.1 requires PIPE_BUF to be at least 512 bytes. (On Linux, PIPE_BUF is 4096 bytes.) The precise semantics depend on whether the file descriptor is nonblocking (O_NONBLOCK), whether there are multiple writers to the pipe, and on n, the number of bytes to be written: O_NONBLOCK , n <= PIPE_BUF n ; write(2) , n O_NONBLOCK , n <= PIPE_BUF n , write(2) , n ; write(2) , errno EAGAIN. O_NONBLOCK , n > PIPE_BUF : , write(2), write(2) ; write(2) , n . O_NONBLOCK , n > PIPE_BUF , write(2) , errno EAGAIN. , 1 n (. ., << >>; write(2), ), , . FIFO O_NONBLOCK O_ASYNC. Setting the O_ASYNC flag for the read end of a pipe causes a signal (SIGIO by default) to be generated when new input becomes available on the pipe. The target for delivery of signals must be set using the fcntl(2) F_SETOWN command. On Linux, O_ASYNC is supported for pipes and FIFOs only since Linux 2.6. ( Linux), : . POSIX.1 . . Linux 4.9 , pipe-user-pages-soft pipe-user-pages-hard fcntl(2) F_SETPIPE_SZ : () , , . , ( , ). Linux 4.9 , . () , . , , , . Linux 4.9 ; . () : (1) . (2) . (3) . This was racey. Multiple processes could pass point (1) simultaneously, and then allocate pipe buffers that were accounted for only in step (3), with the result that the user's pipe buffer allocation could be pushed over the limit. Linux 4.9, , . Before Linux 4.9, bugs similar to points (a) and (c) could also occur when the kernel allocated memory for a new pipe buffer; that is, when calling pipe(2) and when opening a previously unopened FIFO. mkfifo(1), dup(2), fcntl(2), open(2), pipe(2), poll(2), select(2), socketpair(2), splice(2), stat(2), tee(2), vmsplice(2), mkfifo(3), epoll(7), fifo(7) () Alexey, Azamat Hackimov , kogamatranslator49 , Darima Kogan , Max Is , Yuri Kozlov ; GNU (GNU General Public License - GPL, 3 ) , - . - , , () () () <>. Linux 6.9.1 2 2024 . pipe(7)