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
If you want to go the other way round (associate FILE* with existing file descriptor), use fdopen() :
FDOPEN(P) NAME fdopen - associate a stream with a file descriptor SYNOPSIS #include FILE *fdopen(int fildes, const char *mode);