Вопрос по перенаправлению потоков в Linux
Ниибаца 
Мысль такая: в первом случае в fifo пишет шелл, во втором tee. Можно предположить, что шелл пишет как-то хуево. Какой шелл кстати?
P.S. А работа происходит на третьей машине, а так понял?
P.P.S. Я бы наверное решал задачу на perl, через IPC::Open2.

Мысль такая: в первом случае в fifo пишет шелл, во втором tee. Можно предположить, что шелл пишет как-то хуево. Какой шелл кстати?
P.S. А работа происходит на третьей машине, а так понял?
P.P.S. Я бы наверное решал задачу на perl, через IPC::Open2.
bash. На третей, но мне показалось что это пофиг. Ладно, если разберусь когда-нибудь, то расскажу 

PS. Кстати задача очень естественно возникла. Эти процессы общаются в итоге по специфическому сетевому оборудованию (InfiniBand) а чтобы установить соединение нужны особые цифры, которые каждый раз разные и доступны только на противоположной стороне. У самих разработчиков InfiniBand-а есть тестовая програмка, так она эту информацию по сокетам передает, как-то тяжеловато...
Возможно к разгадке приведет такой эксперимент:
Почему Done?
xenon:~$ mkfifo a
xenon:~$ mkfifo b
xenon:~$ cat <a >b &
[1] 25460
xenon:~$ cat >a
asdfg
xenon:~$ cat >a
12345
xenon:~$ cat b
asdfg
12345
[1]+ Done cat <a >b
Почему Done?

Все, разобрался!
Рассказываю.
Сперва замечание
это не верно, в первом случае в fifo пишет сам cmd, точнее его местный представитель -- ssh. bash только только провязывает потоки, а потом делает exec.
Дальше. Проводим эксперимент:
Итого: если сделать системный вызов записи в fifo то застрянешь на нем до тех пор, пока кто-нибудь оттуда не прочитает. По сути под fifo не отводится никаких ресурсов. Записывающий процесс засыпает до тех пор, пока не выяснится кто и куда будет эти данные читать, тогда OS делает копирование, а писатель просыпается.
Ну так вот, в первом случае засыпают ssh, но они то и есть те самые товарищи, которые собирались следующим вызовом прочитать, так что все стоит -- deadlock. А во втором случае спят tee, а ssh продолжают работать и инициируют чтение, чем будят tee.
Звучит логично...
В действительности проще tee заменить на cat
вроде результат должен быть тот же. Пойду на работу -- попробую...
Рассказываю.Сперва замечание
в первом случае в fifo пишет шелл, во втором tee
это не верно, в первом случае в fifo пишет сам cmd, точнее его местный представитель -- ssh. bash только только провязывает потоки, а потом делает exec.
Дальше. Проводим эксперимент:
xenon:~$ echo "123" > x &
[1] 25538
[1] Done echo "123" >x
xenon:~$ mkfifo y
xenon:~$ echo "123" > y &
[1] 25540
xenon:~$ cat y
123
[1]+ Done echo "123" >y
xenon:~$
Итого: если сделать системный вызов записи в fifo то застрянешь на нем до тех пор, пока кто-нибудь оттуда не прочитает. По сути под fifo не отводится никаких ресурсов. Записывающий процесс засыпает до тех пор, пока не выяснится кто и куда будет эти данные читать, тогда OS делает копирование, а писатель просыпается.
Ну так вот, в первом случае засыпают ssh, но они то и есть те самые товарищи, которые собирались следующим вызовом прочитать, так что все стоит -- deadlock. А во втором случае спят tee, а ssh продолжают работать и инициируют чтение, чем будят tee.
Звучит логично...
В действительности проще tee заменить на cat
вроде результат должен быть тот же. Пойду на работу -- попробую...Клевый тред, похож на вот


а) создать канал;
б) установить на обоих концах канала режим неблокирующего
ввода-вывода;
О!
А как?Буферизовать пайп штатными средствами?
---
...Я работаю антинаучным аферистом...
---
...Я работаю антинаучным аферистом...
a)...
b)...
это цитата из FAQ, наверное Глеб знает как...
b)...
это цитата из FAQ, наверное Глеб знает как...
б) установить на обоих концах канала режим неблокирующего ввода-вывода;Речь идет о fcntl(fd, F_SETFL, O_NONBLOCK). Но как это сделать в шелл - не ябу.
Реализуй задачу примерно так на perl: с помощью IPC::Open2 получаешь 4 дескриптора. Дальше на на них select и читаешь/пишешь что куда надо.
это цитата из FAQ, наверное Глеб знает как...Это FAQ писал не я

Реализуй задачу примерно так на perl
Зачем? У меня с tee работает

Оставить комментарий
rosali
Задача: надо на двух машинах запустить по программе, так чтобы вход каждой из них был выходом другой.Решение:
Не работает
Зато работает так:
Казалось бы это почти то же самое, но работает только второе.
Хотелось бы услышать лекцию на тему...