Как узнать, сколько данных помещено в очередь в именованном канале?

#c #linux

#c #linux

Вопрос:

В окне Linux у меня есть пара процессов, записывающих в именованный канал, а другой — считывающий его. Я подозреваю, что мой читатель не успевает, и в канале много данных, поставленных в очередь.

Кто-нибудь, пожалуйста, скажите мне, есть ли способ проверить / посмотреть, сколько данных помещено в очередь в канале? Любая команда Linux или C API?

Спасибо за ваше время.

—KS

Ответ №1:

Я не думаю, что FIONREAD будет работать, поскольку FIONREAD определяется значением, возвращаемым i_size_read, которое хранится в индексе как i_size . i_size не используется с каналами (именно поэтому stat всегда возвращает 0 для размера канала).

http://lxr.free-electrons.com/source/include/linux/fs.h#L848

Должна быть возможность получить размер путем суммирования свойства len буферов (i_node.i_pipe.bufs). Не похоже, что это значение отображается stat или ioctl.

https://github.com/mirrors/linux-2.6/blob/master/fs/pipe.c

Ответ №2:

Вы можете попробовать recv(…, MSG_PEEK) — это должно считываться из канала без удаления из него данных (поэтому при следующем чтении будут возвращены те же данные). Это не обязательно расскажет вам обо всех данных, поставленных в очередь, только о некоторых из них.