A process wishing to get data from a pipe issues a read( ) system call, specifying the file descriptor associated with the pipe's reading end. As described in Section 12.6.2, the kernel ends up invoking the read method found in the file operation table associated with the proper file object. In the case of a pipe, the entry for the read method in the read_pipe_fops table points to the pipe_read( ) function.
The pipe_read( ) function is quite involved, since the POSIX standard specifies several requirements for the pipe's read operations. Table 19-2 summarizes the expected behavior of a read( ) system call that requests n bytes from a pipe that has a pipe size (number of bytes in the pipe buffer yet to be read) equal to p.
The system call might block the current process in two cases:
• The pipe buffer is empty when the system call starts.
• The pipe buffer does not include all requested bytes, and a writing process was previously put to sleep while waiting for space in the buffer.
Notice that the read operation can be nonblocking: in this case, it completes as soon as all available bytes (even none) are copied into the user address space. £3!
Was this article helpful?