Пустой или" промыть " файловый дескриптор без 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 [...]
для 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
и splice
ing данные из дескриптора исходного файла в /dev/null
дескриптор файла.