Пустой или" промыть " файловый дескриптор без read ()?

(Примечание: это не вопрос о том, как сбросить write(). Это другой конец это, так сказать.)

можно ли очистить файловый дескриптор, в котором есть данные для чтения без необходимости read() это? Возможно, вас не интересуют данные, и чтение всего этого приведет к потере места и циклов, для которых у вас может быть лучшее использование.

Если это невозможно в POSIX, есть ли какие-либо операционные системы непереносимые способы сделать это?

обновление: обратите внимание, что я говорю о файловые дескрипторы, не потоки.

7 ответов


потоки имеют доступный fclean, который сбрасывает буфер записи и возвращает буфер чтения обратно в систему ввода-вывода.

http://www.gnu.org/software/hello/manual/libc/Cleaning-Streams.html

Если то, что вы действительно хотите сделать, это пропустить байты, изменение положения указателя файла является правильным действием. Просто пропустите вперед столько байтов, сколько вы не хотите читать.

http://www.gnu.org/software/hello/manual/libc/File-Position-Primitive.html#File-Position-Primitive


Если вы имеете дело с tty посмотри tcflush():

#include <termios.h>
int tcflush(int fildes, int queue_selector);

после успешного завершения tcflush() отбрасывает данные, записанные в объект ссылается на fildes (открытый файл дескриптор, связанный с терминалом) но не переданные или полученные данные но не читать, в зависимости от значения из queue_selector [...]

http://opengroup.org/onlinepubs/007908775/xsh/tcflush.html


для POSIX, используйте lseek(2) или lseek64(3) стремиться вперед. Для Windows, используйте SetFilePointer() или SetFilePointerEx().


ни read (), ни flush () не являются частью стандартных C или C++, но, конечно, ни одна из стандартных функций не поддерживает промывку входных потоков. Я бы предположил, что это отражает что-то недоступное в базовых операционных системах. Обычный способ избежать чтения чего-либо вообще-это пропустить его с помощью функции seek ().


если вы знаете количество байтов, чтобы пропустить, Вы можете сделать lseek(fd, n, SEEK_CUR); для систем POSIX. Есть fseek() для FILE * объекты. В POSIX, я думаю, вы можете безопасно искать конец файла, идея заключается в том, что если больше данных будет записано позже, чтобы данные прошли мимо позиции с lseek(), вы сможете прочитать больше данных.


по данным этой, система POSIX сделает это на fflush(stream); .

для потока, открытого для чтения, если файл еще не находится в EOF, и файл способен искать, смещение файла базового открытого описания файла должно быть отрегулировано так, чтобы следующая операция в открытом описании файла имела дело с байтом после последнего считывания или записи в поток, который сбрасывается.


Linux 2.6.17 или более поздней версии с библиотекой GNU C версии 2.5 или более поздней содержат splice() системный вызов, который можно использовать для отправки данных из одного файлового дескриптора в другой без копирования в пространство пользователя. Это можно использовать для удаления данных, просто открыв /dev/null и spliceing данные из дескриптора исходного файла в /dev/null дескриптор файла.