Определить, кто прослушивает именованный канал fifo

Скажем, у меня есть именованный канал:

mypipe="foobar"
mkfifo $mypipe

... позже скажу, что хочу написать на него

echo "foo" > $mypipe

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


person Community    schedule 04.03.2018    source источник
comment
Вы, кажется, настраиваете себя на состояние гонки. В чем проблема с зависанием звонка до тех пор, пока кто-то не будет готов прочитать данные?   -  person Asad Saeeduddin    schedule 04.03.2018
comment
Я согласен с условием гонки, но для моего случая использования, если кто-то не готов читать, он никогда не будет готов, в основном, поэтому я просто выхожу/возвращаюсь, прежде чем пытаться писать   -  person    schedule 04.03.2018
comment
Если читатель умирает между вызовом fuser и вызовом echo, у вас все еще есть та же проблема. Проверка с помощью fuser, позволяющая избежать тайм-аутов для echo в большинстве случаев, является допустимой оптимизацией, но вам все равно придется справляться с возможностью зависания echo.   -  person tripleee    schedule 04.03.2018


Ответы (1)


Утилита fuser сообщает вам, кто владеет открытым дескриптором, но в общем случае она требует привилегий root.

Цитируя страницу руководства,

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

Установка fuser SUID root позволит избежать проблем, связанных с частичной информацией, но может быть нежелательной по соображениям безопасности и конфиденциальности.

person tripleee    schedule 04.03.2018