Запретить сбой машины, нет, она не может потерять данные. Однако легко использовать его неправильно и думать, что вы теряете данные, либо потому, что при записи не удалось записать все запрошенные вами данные, а вы не проверили возвращаемое значение или сделали что-то не так с чтением.
Максимальный объем данных, который он может хранить, зависит от системы - если вы попытаетесь записать больше, вы получите короткую запись, или устройство записи заблокируется, пока не освободится место. Страница man pipe(7)
содержит много полезной информации о каналах, включая (по крайней мере, в Linux) размер буфера. Linux имеет буферы 4K или 64K в зависимости от версии.
редактировать
Тим упоминает SIGPIPE, что также является потенциальной проблемой, которая может привести к потере данных. Если считыватель закрывает канал перед тем, как прочесть все в нем, непрочитанные данные будут выброшены, и записывающее устройство получит сигнал SIGPIPE, когда он выполнит дополнительную запись или закроет канал, указывая, что это произошло. Если они блокируют или игнорируют SIGPIPE, они получат ошибку EPIPE. Это покрывает ситуацию, о которой говорил Павел.
PIPE_BUF
- это константа, которая сообщает вам предел атомарных записей в буфер. Любая запись этого размера или меньше будет либо полностью успешной, либо заблокированной, пока не получится полностью (или выдаст EWOULDBLOCK / EAGAIN, если канал находится в неблокирующем режиме). Он не имеет никакого отношения к фактическому размеру конвейерного буфера ядра, хотя очевидно, что размер буфера должен быть не менее PIPE_BUF, чтобы соответствовать гарантии атомарности.