2015-02-04 2 views
1

Я работаю над a flow-based programming system called net2sh. В настоящее время он основан на инструментах оболочки, связанных именованными каналами. Несколько процессов работают вместе, чтобы выполнить работу, передавая по именованным каналам, в отличие от производственной линии на заводе.как избежать тупика с параллельными именованными трубами?

В целом он отлично работает, однако есть одна серьезная проблема с ним. В случае, когда процессы обмениваются данными по двум или более именованным каналам, процесс «отправки» и «прием» должен открывать трубы в том же порядке. Это происходит потому, что когда процесс открывает именованный канал, он блокируется до тех пор, пока другой конец не будет открыт.

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

В идеале я ищу опцию «неблокирующий fifo», где «открыть» на fifo всегда удается сразу, но последующие операции могут блокироваться, если буфер буфера заполнен (или пустым, для чтения) ... I даже рассмотрим возможность использования патча ядра для этого. Согласно fifo (7) O_NONBLOCK делает что-то другое при открытии fifos, а не в том, что я хочу точно, и для того, чтобы использовать это, мне пришлось бы переписать все существующие инструменты оболочки, такие как cat.

Вот минимальный пример, который ТУПИКИ:

mkfifo a b 
(> a; > b;) & 
(< b; < a;) & 
wait 

Если вы можете помочь мне решить эту проблему здраво, я буду очень благодарен!

ответ

2

Существует хорошее описание использования O_NONBLOCK с именованными трубами здесь: How do I perform a non-blocking fopen on a named pipe (mkfifo)?

Это звучит, как вы хотите, чтобы работать во всей среде без изменения коды C. Поэтому одним из подходов было бы установить LD_PRELOAD в некоторую общую библиотеку, которая содержит обертку для open(2), которая добавляет O_NONBLOCK к flags всякий раз, когда pathname относится к именованному каналу.

Краткий пример использования LD_PRELOAD переопределить функцию библиотеки здесь: https://www.technovelty.org/c/using-ld_preload-to-override-a-function.html

ли это на самом деле работает на практике, не нарушая ничего другого, вы должны выяснить для себя (пожалуйста, сообщите нам об этом!) ,

+0

Спасибо, это хорошая идея. Я думаю, что мне нужно будет сделать некоторые дополнительные хакеры, а не просто добавить O_NONBLOCK, чтобы открыть, но он может быть полезен. Очень признателен. LD_PRELOAD, хотя и несколько злой, безопаснее и менее сложно, чем исправлять ядро! –

Смежные вопросы