Есть ли способ скопировать содержимое ФАЙЛА* в файловый дескриптор?

Под этим я подразумеваю функционально. Я использую fileno для преобразования FILE * в fd, и он возвращается без каких-либо ошибок, но когда я использую pread для этого возвращаемого значения из fileno, это дает мне ошибку неверного дескриптора файла. IE:

FILE* fin;
FILE* fout;
int fd, result;
fd = open("path", O_RDWR);
// Do stuff with fin and fout
// fout is the file with all of the stuff I want to copy to the fd
fd = fileno(fout);
result = pread(fd, buf, size, offset); // Bad file descriptor--returns a 9

Я не могу понять, что заставляет pread выдавать мне эту ошибку, и это сводит меня с ума.


person LOL. NO.    schedule 29.04.2012    source источник
comment
Разве вы не можете открыть оба конца с помощью open?   -  person James McLaughlin    schedule 30.04.2012
comment
pread возвращает 9 или возвращает -1 и устанавливает errno в 9? Если первое, это означает, что по какому-то совпадению осталось прочитать 9 байт. Если он возвращает -1, а errno равно 9 (EBADF), то что-то уже fclosed fout.   -  person torek    schedule 30.04.2012
comment
Разве вы не хотите использовать fout = fopen("path", "rw");? Код, который вы разместили, показывает, что fout не определен, поэтому было бы ужасно удивительно, если бы он сделал что-то полезное.   -  person Thomas M. DuBuisson    schedule 30.04.2012
comment
Извиняюсь. pread вернул -1 и установил для errno значение 9. Это всего лишь фрагмент моего кода — вставка всего этого была бы очень, очень длинной. Что касается fd, то это файловый дескриптор, поэтому не нужно ли использовать open вместо fopen? Однако я еще не пробовал использовать open.   -  person LOL. NO.    schedule 30.04.2012


Ответы (2)


Я предполагаю, что fout не является допустимым указателем FILE*. Вы проверили это? Вы проверили возвращаемое значение fileno?

person Karoly Horvath    schedule 29.04.2012
comment
Нет, это не значит, что он работает нормально. Это означает, что вы вызвали неопределенное поведение. - person R.. GitHub STOP HELPING ICE; 30.04.2012
comment
Когда я читал справочную страницу, я подумал, что если она возвращает число, отличное от -1, значит, все работает нормально? - person LOL. NO.; 30.04.2012

Вы проверили возврат от fileno()?
справочная страница fileno()

person Chimera    schedule 30.04.2012