Как получить доступ к стандартному стандартному вводу при использовании перенаправления файлов?

Мне нужно запустить скрипт и иметь доступ к стандартному стандартному входу (терминальному вводу) в моей программе. Я мог бы сделать ./program «скрипт», открывая и анализируя скрипт через программу, но я хочу сделать его в стиле POSIX, принимая ввод из каналов или из перенаправления.

Я имею в виду, поскольку моя программа является синтаксическим анализатором, я мог бы запустить ./program, набрать скрипт и по-прежнему использовать стандартный ввод (например, в скане). Но я хотел бы запустить сценарий ./program ‹ и по-прежнему иметь возможность использовать стандартный ввод (в сканф).

Моя программа представляет собой упрощенный интерпретатор Паскаля, поэтому мне нужно запускать read(x) и write(x) в своих сценариях.

Да, это домашняя работа (переводчика), но сомнения возникли просто в процессе мозгового штурма.


person Spidey    schedule 30.06.2009    source источник


Ответы (3)


ttyname(0) вернет имя файла текущего терминала, связанного со стандартным вводом. Затем вы можете открыть его и прочитать из него.

person Nick Lewis    schedule 30.06.2009
comment
Ну, я думаю, вы узнаете что-то новое каждый день. :) Тем не менее, это не похоже на то, что хотелось бы делать часто. :) - person Brian Arnold Sinclair; 01.07.2009
comment
Это не обычное дело, но мне пришлось использовать его для реализации программы «больше» для класса в прошлом году. Считывает ввод из файла и выводит его на стандартный вывод, но также должен считывать ввод с клавиатуры, чтобы продолжить прокрутку. :) - person Nick Lewis; 01.07.2009
comment
Вы сделали больше, чем приняли конвейерный/перенаправленный ввод? Кстати, ttyname(0) получит стандартный ввод, но так как он был перенаправлен, я не получу терминал, не так ли? Возможно, я мог бы использовать возвращенную строку, чтобы узнать, что такое стандартный ввод... - person Spidey; 01.07.2009
comment
/dev/tty/XXX — это само устройство, поэтому при его открытии будут вводиться данные с реального устройства. stdin — это просто стандартный входной поток, который ТИПИЧНО /dev/tty/XXX, но заменяется на входной файл при использовании перенаправления ввода. - person Nick Lewis; 01.07.2009
comment
Значит, 0 в имени ttyname не совпадает с 0 в стандартном вводе? На самом деле это терминал 0, который всегда является текущим терминалом? - person Spidey; 05.07.2009

Доступ к текущему управляющему терминалу можно получить с помощью /dev/tty, даже если стандартный ввод был перенаправлен.

person mark4o    schedule 30.06.2009
comment
Возможно, стоит добавить, что открытие /dev/tty не удастся в тех случаях, когда не существует управляющего терминала. Два распространенных случая: процесс был запущен через cron или через at. Как правило, процессы, запускаемые демонами, сами являются демонами и не имеют управляющего терминала. - person Ingo; 29.05.2010

Насколько я понимаю, о чем вы просите, вы просите о возможности принимать интерактивный ввод от пользователя при использовании перенаправления файлов, например, в сценарии ./program ‹ выше.

Я не верю, что есть способ сделать это. Система POSIX будет передавать скрипт через стандартный ввод и все. Никакого взаимодействия с пользователем.

Также стоит отметить, что вам не нужно делать ничего особенного, чтобы понять это. Просто относитесь к стандартному вводу, как обычно. Вам не нужно думать о том, поступает ли он в интерактивном режиме или из файла, что действительно очень приятно.

person Brian Arnold Sinclair    schedule 30.06.2009
comment
И последний бит, о перенаправлении файлов, который я уже знал, что я действительно хотел знать, так это файл, к которому привязан текущий терминал, как и заявил mark4o. - person Spidey; 01.07.2009