LINUX.ORG.RU

named pipe + сигнал изменения состояния pipe


0

0

Ситуация:

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

Задача:

Как мне сделать чтобы демон получал извещение ( я полагаю это можно сделать через механизм сигналов) о том что в pipe записаны некоторые данные, по которому он бы производил их обработку. Все остальное время он должен спать (sleep()). Оснобенно интересуют конкретные примеры и чтоб это работало на Linux и FreeBSD.

anonymous

> Как мне сделать чтобы демон получал извещение

man fcntl в районе F_SETOWN

Только ты, кажется, глупость делать затеваешь!

> я полагаю это можно сделать через механизм сигналов

Зачем? Все уже сделано.

Как мне сделать чтобы демон получал извещение ... о том что в pipe записаны некоторые данные, ... остальное время он должен спать...

Просто читай свой пайп!

Как только будут данные, демон проснется и обработает их. Потом снова присосется к пайпу -- и заснет, пока данные не появятся.

Если надо посложнее алгоритм (e.g., несколько пайпов поллить) -- man poll, man select

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

Я в принципе так делал, только почемуто SIGIO не посылался. Я думал что такой метод для pipe-ов "не канает". Видимо руки кривые ... попробую найти ошибку.

Потом, почему ты считаешь что я затеваю глупость ? Я поясню свою задачу. Хочу сделать демона к которому можно было бы легко "достучатся" при помощи обычных пользовательских утилит (echo, cat и т.д.) Другими словами демон должен иметь "информационный вход/выход" представленный на уровне файловой системы чтоб с ним можно было проводить операции чтения и записи практически (!) как с обычным файлом. Я только начинаю изучать UNIX и первое что мне попалось это named pipe. Если есть другие варанты то с удовольствием об них узнаю ...

anonymous
()
Ответ на: комментарий от anonymous

anonymous (*) (13.01.2005 14:46:24):

> Потом, почему ты считаешь что я затеваю глупость ?

Я могу только повторить то, что уже написАл. Попробуй понять.

Еще раз:

ПРОСТО читай демоном из пайпа.

Пока там нет данных, демон будет спать. Как только данные появятся, демон будет разбужен.

НЕ НАДО НИЧЕГО делать. Все сделает операционная система.

> Я только начинаю изучать UNIX

Такое работает и под Юнихом. и под Вындузом, и под ДОСом, и ... (поставь любую операционку).

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

а. понял. т.е. засыпание происходит в момент, когда я пытаюсь читать из pipe-а, но он пуст. Ступил чего-то.

anonymous
()
Ответ на: комментарий от anonymous

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

anonymous
()
Ответ на: комментарий от anonymous

anonymous (*) (13.01.2005 16:11:59):

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

Правильно.

Для более сложных случаев (например, сразу за несколькими дескрипторами следить) есть такие звери, как select и poll

Еще тонкость:

Если читаешь буферами (например, пользуешь функции из stdio), не забудь их выталкивать. Вообще, если не до конца представляешь себе структуру функции из stdio (printf/scanf/gets etc.), то лучше не пользваться ими -- повиснешь.

Используй голые read/write, без оберток. И помни, что их нельзя мешать с функциями из stdio.

Удачи!

Die-Hard ★★★★★
()
Ответ на: комментарий от anonymous

> Выталкивать всмысле flush() ?

если пользуешься stdio, то fflush(). Или внимательно изучить модели буферизации и настроить нужную.

И общаться только законченными строками (в конце каждой строки, посылаемой серверу/сервером, обязательно должен быть '\n').

Die-Hard ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.