And is there an upper limit on how much data it can contain?
Share
Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.
Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.
Lost your password? Please enter your email address. You will receive a link and will create a new password via email.
Please briefly explain why you feel this question should be reported.
Please briefly explain why you feel this answer should be reported.
Please briefly explain why you feel this user should be reported.
Barring a machine crash, no it can’t lose data. It’s easy to misuse it and think you’re losing data however, either because a write failed to write all the data you requested and you didn’t check the return value or you did something wrong with the read.
The maximum amount of data it can hold is system dependent — if you try to write more than that, you’ll either get a short write or the writer will block until space is available. The
pipe(7)man page contains lots of useful info about pipes, including (on Linux at least) how big the buffer is. Linux has buffers of 4K or 64K depending on version.edit
Tim mentions SIGPIPE, which is also a potential issue that can seem to lose data. If the reader closes the pipe before reading everything in it, the unread data will be thrown away and the writer will get a SIGPIPE signal when they write more or close the pipe, indicating that this has occurred. If they block or ignore the SIGPIPE, they’ll get an EPIPE error. This covers the situation Paul mentioned.
PIPE_BUFis a constant that tells you the limit of atomic writes to the buffer. Any write this size or smaller will either succeed completely or block until it can succeed completely (or give EWOULDBLOCK/EAGAIN if the pipe is in non-blocking mode). It has no relation to the actual size of the kernel’s pipe buffer, though obviously the buffer must be at least PIPE_BUF in size to meet the atomicity guarentee.