Я работаю над a flow-based programming system called net2sh. В настоящее время он основан на инструментах оболочки, связанных именованными каналами. Несколько процессов работают вместе, чтобы выполнить работу, передавая по именованным каналам, в отличие от производственной линии на заводе.как избежать тупика с параллельными именованными трубами?
В целом он отлично работает, однако есть одна серьезная проблема с ним. В случае, когда процессы обмениваются данными по двум или более именованным каналам, процесс «отправки» и «прием» должен открывать трубы в том же порядке. Это происходит потому, что когда процесс открывает именованный канал, он блокируется до тех пор, пока другой конец не будет открыт.
Я хочу, чтобы избежать этого, не создавая дополнительных «вспомогательных» процессов для каждой трубы, без необходимости взломать существующие компоненты и не связываться с программными сетями, чтобы избежать этой проблемы.
В идеале я ищу опцию «неблокирующий fifo», где «открыть» на fifo всегда удается сразу, но последующие операции могут блокироваться, если буфер буфера заполнен (или пустым, для чтения) ... I даже рассмотрим возможность использования патча ядра для этого. Согласно fifo (7) O_NONBLOCK делает что-то другое при открытии fifos, а не в том, что я хочу точно, и для того, чтобы использовать это, мне пришлось бы переписать все существующие инструменты оболочки, такие как cat.
Вот минимальный пример, который ТУПИКИ:
mkfifo a b
(> a; > b;) &
(< b; < a;) &
wait
Если вы можете помочь мне решить эту проблему здраво, я буду очень благодарен!
Спасибо, это хорошая идея. Я думаю, что мне нужно будет сделать некоторые дополнительные хакеры, а не просто добавить O_NONBLOCK, чтобы открыть, но он может быть полезен. Очень признателен. LD_PRELOAD, хотя и несколько злой, безопаснее и менее сложно, чем исправлять ядро! –