Чтение и запись в I/O устроены куда менее симметрично, чем вы думаете
Reading and writing are less symmetric than you (probably) think
Автор разбирает, почему read(2) и write(2) ведут себя по-разному, хотя выглядят зеркально. При чтении ошибки всплывают до возврата из fread: ядро и буферный кэш успевают сообщить о проблеме. При записи всё иначе — данные оседают в буферах, вызов возвращается с успехом, а настоящая запись и её ошибки откладываются до fflush, fclose или fsync. Многие программисты не проверяют коды возврата этих функций и теряют данные, даже не подозревая об этом.
Буферизованная запись откладывает реальный системный вызов write — в этом весь смысл. Но это означает, что и сообщение об ошибках тоже откладывается!