Когда я выполняю " python
" из терминала без аргументов, появляется интерактивная оболочка Python.
Когда я cat | python
запускаю " " с терминала, он не запускает интерактивный режим. Каким-то образом, не получая никаких данных, он обнаружил, что подключен к трубе.
Как мне сделать подобное обнаружение в C, C ++ или Qt?
Ответы:
Использование
isatty
:(На окнах они начинаются с подчеркивания:
_isatty
,_fileno
)источник
io.h
иisatty()
нужно включатьunistd.h
.less
.Резюме
Для многих случаев использования функция POSIX
isatty()
- это все, что нужно, чтобы определить, подключен ли stdin к терминалу. Минимальный пример:В следующем разделе сравниваются различные методы, которые можно использовать, если необходимо протестировать разные степени интерактивности.
Подробно о методах
Есть несколько способов определить, работает ли программа в интерактивном режиме. В следующей таблице представлен обзор:
Результаты получены в системе Ubuntu Linux 11.04 с использованием следующей программы:
Временное устройство
Если интерактивному сеансу требуются определенные возможности, вы можете открыть терминальное устройство и (временно) установить необходимые атрибуты терминала через
tcsetattr()
.Пример Python
Код Python, который определяет, запускается ли интерпретатор в интерактивном режиме, использует
isatty()
. ФункцияPyRun_AnyFileExFlags()
звонки
Py_FdIsInteractive()
который звонит
isatty()
.Вывод
Есть разные степени интерактивности. Для проверки того
stdin
, подключен ли он к каналу / файлу или к реальному терминалу,isatty()
является естественным способом сделать это.источник
Вероятно, они проверяют тип файла "stdin" с помощью fstat, примерно так:
Конечно, Python имеет открытый исходный код, так что вы можете просто посмотреть, что они делают, и знать наверняка:
http://www.python.org/ftp/python/2.6.2/Python-2.6.2.tar.bz2
источник
В Windows вы можете использовать GetFileType.
источник
Вызовите stat () или fstat () и посмотрите, установлен ли S_IFIFO в st_mode.
источник
Можно позвонить
stat(0, &result)
и проверить!S_ISREG( result.st_mode )
. Но это Posix, а не C / C ++.источник