It turns out this whole misunderstanding of the open() versus fopen() stems from a buggy I2C driver in the Linux 2.6.14 kernel on an ARM. Backporting a worki
Have you tried disabling buffering?
setvbuf(fd, NULL, _IONBF, 0);