Пустой или "флеш" дескриптор файла без чтения()?
(Примечание. Это не вопрос о том, как очистить 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
Ответ 3
Для POSIX используйте lseek(2)
или lseek64(3)
, чтобы искать вперед. Для Windows используйте SetFilePointer()
или SetFilePointerEx()
.
Ответ 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
.