2012-01-04 3 views
2

Когда я открыть терминал работает Баш и введите следующее:Как отправить конец файла через трубу, не закрывая трубу?

cat\nfoo\n^Decho bar\n 

(где \ п входить и^D является контроль-д) я получаю:

foo 
bar 

т.е.^D причины cat, чтобы выйти, но я все еще могу напечатать больше.
Как я могу отправить тот же ввод (в частности, конец файла) через (unix) канал в C?

ответ

6

xterm не выполняет свой ввод с оболочкой и утилитами через pipe(7) s. Вместо этого используется каркас Unix PTY (см. pty(7), openpty(3), forkpty(3), posix_openpt(3), pts(4) manaages для некоторой информации). Структура PTY позволяет любому процессу служить терминальным «ведущим» (например, telnetd(8), sshd(8), xterm(1) и т. Д.), И любой процесс может подключаться к ведомому терминалу, чтобы обеспечить интерактивную среду, например, сидя на консоли.

Advanced Programming in the Unix Environment, 2nd edition книга Stevens and Rago имеет отличную главу по использованию псевдо-терминальное устройства для управления ведомыми программ - в то числе отличной маленького pty программы, которая позволяет управлять «интерактивной» программой в манере, аналогичной expect(1), но и в C, а не tcl.

+1

... Вау, я действительно забываю, как сломанный unix - это когда все остальное еще хуже. +1, надеюсь, избиение pty в интерфейсе полуработающей трубы не будет слишком тяжелым. –

3

Control-D специально для терминала, а не для общего ввода. Просто закройте трубу.

+0

Нет, я имею в виду, как я могу заставить чтение процесса из трубы в настоящее время читать EOF, но затем продолжать писать на него (например,/usr/bin/xterm)? –

+2

Единственный способ заставить читателя получить EOF-ошибку, чтобы файл был в конце; трубы никогда не заканчиваются, пока все возможные авторы не закрыли свой доступ к ней. EOF не является символом, который читается, это состояние файла. – mah

+1

Тогда как/usr/bin/xterm (и другие эмуляторы терминала) отправляют EOF в свои подпроцессы? –

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