Пустой или "флеш" дескриптор файла без чтения()?

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

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

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

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

Ответ 1

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

Ответ 2

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

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

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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