Как отправить конец файла через канал, не закрывая канал? - PullRequest
2 голосов
/ 04 января 2012

Когда я открываю терминал с запущенным bash и набираю следующее:

cat\nfoo\n^Decho bar\n

(где \ n - это ввод, а ^ D - это контроль-d) Я получаю:

foo
bar

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

Ответы [ 2 ]

6 голосов
/ 04 января 2012

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

Расширенное программирование в среде Unix, 2-е издание книга Стивенса и Раго содержит отличную главу об использовании псевдо-терминальных устройств для управления подчиненными программами.- включая отличную небольшую pty программу, которая позволяет управлять "интерактивными" программами способом, подобным expect(1), но на C, а не tcl.

3 голосов
/ 04 января 2012

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

...