|
|
ru.linux- RU.LINUX --------------------------------------------------------------------- From : Valentin Nechayev 2:5020/400 23 Jan 2003 01:27:22 To : Zahar Kiselev Subject : Re: научный вопрос -------------------------------------------------------------------------------- >>> Zahar Kiselev wrote: ZK> Отсюда возникла мысль - поразбираться в механизме переназначения ZK> stdin/stdout для запускаемой посредством fork/exec программы и ZK> "подключиться" не только к ее stdin, но и к stdout тоже. Чтобы после запуска ZK> можно было в один дескриптор писать команды, а из другого получать ответы. А ZK> программа(гнуплот в моем случае) рисует графики на иксовом экране. Переназначить одновременно stdin и stdout несложно. А вот в стандартной библиотеке нет такого потому, что возникает проблема синхронизации действий по вводу и действий по выводу. Когда человек сидит за терминалом, он, как event-driven система, отрабатывает эту синхронизацию беспроблемно. Для программы, которая на это незаточена, элементарно получить deadlock и прочие "приятные" ситуации. ZK> Остается подсмотреть где-нибудь как одновременно переназначить stdin и ZK> stdout запускаемой программы и отдать "ручки управления"(хэндлы) ZK> родительскому процессу. Только не предлагай исходник bash изучать - он ZK> немного великоват будет в качестве учебного пособия:-) Иди в ru.unix.prog, поможем ;) ZK> Вообще-то как минимум один способ мы с приятелем лет пять назад нашли и ZK> использовали - через пару псевдотерминалов. Программка та и сейчас работает. ZK> Какой ужас. ZK> умеют. Следовательно надо где-то подсмотреть - что надо сделать между fork и ZK> exec в порожденном процессе чтобы получить нужное переназначение. Видел ZK> однажды исходник, там был трюк с _закрытием_ stdout и открытием "трубы". В ZK> результате открываемый дескриптор попадал на "первое свободное" место, то ZK> есть как раз на место закрытого стандартного вывода и становился стандартным ZK> выводом. Вот только не знаю, насколько подобные предположения правомерны - ZK> всегда ли это сработает. Правомерны. Использование первого свободного дескриптора гарантируется Posix, поэтому если 0 занят, а 1 только что закрыли, то open() отдаст или ошибку, или 1. Вот грабля тут есть - не всегда close() завершается успешно с закрытием дескриптора, бывают (хотя крайне редко) и более извратные позы. ZK> Судя по моим экспериментам - похоже и десять раз в секунду работать может ZK> если график простой! Hадо только озаботиться синхронизацией, чтобы не ZK> "перекормить" гнуплот данными. Во-во. -netch- --- ifmail v.2.15dev5 * Origin: Dark side of coredump (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.linux/736880916bac.html, оценка из 5, голосов 10
|