Пустой или "очистить" дескриптор файла без read ()? - PullRequest
11 голосов
/ 17 декабря 2009

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

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

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

ОБНОВЛЕНИЕ: Обратите внимание, что я говорю о файловых дескрипторах , , а не потоков.

Ответы [ 7 ]

7 голосов
/ 02 июня 2010

Если вы имеете дело с tty , взгляните на tcflush():

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

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

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

3 голосов
/ 27 декабря 2009

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

2 голосов
/ 17 декабря 2009

Потоки имеют доступную функцию 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

1 голос
/ 27 декабря 2009

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

1 голос
/ 17 декабря 2009

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

0 голосов
/ 30 сентября 2015

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

0 голосов
/ 17 декабря 2009

Согласно это , система POSIX сделает это на fflush(stream);.

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

...