Определите размер канала без вызова read () - PullRequest
8 голосов
/ 16 сентября 2008

Мне нужна функция с именем SizeOfPipe (), которая должна возвращать размер канала. Я хочу только знать, сколько данных находится в канале, а не фактически читать данные из самого канала.

Я думал, что следующий код будет работать

fseek (pPipe, 0 , SEEK_END);
*pBytes = ftell (pPipe);
rewind (pPipe);

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

Ответы [ 12 ]

0 голосов
/ 16 сентября 2008

Я не думаю, что это возможно. Каналы представляют потоковый протокол, а не пакетный. Итак, если вы записываете в канал дважды, один раз, скажем, с 250 байтами и один раз, скажем, с 520 байтами, невозможно определить, сколько байтов вы получите с другого конца в одном запросе чтения. Вы можете получить 256, 256, а затем остальные.

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

0 голосов
/ 16 сентября 2008

Я не думаю, что это возможно, разве это не точка канала для обеспечения межпроцессного взаимодействия между двумя концами (в одном направлении). Если я прав в этом утверждении, отправка, возможно, еще не завершила передачу данных в канал - поэтому было бы невозможно определить длину.

Какую платформу вы используете?

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