Смешивание fdopen () и open () -> плохой дескриптор файла - PullRequest
5 голосов
/ 07 декабря 2011
int source = open("hi", O_CREAT | O_RDONLY);
int dest = open("resultfile", O_CREAT | O_RDWR | O_TRUNC);

FILE* source1 = fdopen(source, "r");  
FILE* dest1 = fdopen(dest, "w+");

// outside of a testcase I would write something into 'resultfile' here

close(source);
close(dest);
fclose(source1);
fclose(dest1);

int sourcef = open("resultfile", O_RDONLY);
printf(strerror(errno)); // <--- Bad file descriptor

Я не понимаю, почему?Как я могу успешно смешать потоковый ввод-вывод с open ()?

Библиотека, с которой я работаю, принимает только целое число fd (и библиотека несет внутреннюю ответственность за ее закрытие, предположительно с close ()), но мне все еще нужно работать с файломне понимаю, как это возможно без вызовов f (), таких как (fread (), ftell () и т. д.)

1 Ответ

13 голосов
/ 07 декабря 2011

fclose звонки close для вас. Если вы хотите сохранить fd после вызова fclose, dup сначала fd.

int fd = open(...);
int fd2 = dup(fd);
FILE *fp = fdopen(fd2);
fclose(fp);
// fd is still valid.

Сообщение об ошибке неверного дескриптора файла в вашем примере задерживается на вызове fclose(dest1).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...