Определите, сколько я могу записать в файловый дескриптор; копирование данных с одного FH на другой - PullRequest
2 голосов
/ 20 апреля 2010

Как определить, могу ли я записать заданное количество байтов в дескриптор файла (на самом деле, в сокет)?(В качестве альтернативы, как «непрочитать» данные, которые я прочитал из другого дескриптора файла?)

Я хочу что-то вроде:

n = how_much_can_I_write(w_handle);
n = read(r_handle, buf, n);
assert(n==write(w_handle, buf, n));

Оба дескриптора файла (r_handle и w_handle) получили статус готовности отepoll_wait.

Я хочу, чтобы все данные из r_handle были скопированы в w_handle без использования буфера "write долгов".

В общем, как просто скопировать данные из одного дескриптора файла в другой инадежно?

@ related Как я могу "соединить" два сокета в Linux?

Ответы [ 2 ]

0 голосов
/ 20 апреля 2010

Я не думаю, что есть какой-либо интерфейс, который позволяет вам получить доступ к этой информации, и она все равно устареет, как только вы ее получите.

Я бы рекомендовал установить оба дескриптора файла неблокирующими, затем читать / записывать блоки размером 1 КБ (возможно, больше) до тех пор, пока вы не получите EAGAIN / EWOULDBLOCK, когда вы должны кэшировать один блок до следующего раза, когда запись fd будет готова.

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

0 голосов
/ 20 апреля 2010

Вы не можете сделать это - как только данные записаны, они записаны - операция не является обратимой или предсказуемой заранее. Вам нужно переосмыслить логику вашей программы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...