Kiedy wykonuję " python
" z terminala bez argumentów, wyświetla się interaktywna powłoka Pythona.
Kiedy wykonuję " cat | python
" z terminala, nie uruchamia to trybu interaktywnego. W jakiś sposób, nie otrzymując żadnego sygnału wejściowego, wykrył, że jest podłączony do rury.
Jak wykonać podobne wykrywanie w C, C ++ lub Qt?
Odpowiedzi:
Zastosowanie
isatty
:(Na oknach są one prefiksem podkreślenia:
_isatty
,_fileno
)źródło
io.h
iisatty()
musisz dołączyćunistd.h
.less
.Podsumowanie
W wielu przypadkach funkcja POSIX
isatty()
jest wszystkim, czego potrzeba, aby wykryć, czy stdin jest podłączone do terminala. Minimalny przykład:Poniższa sekcja porównuje różne metody, które można zastosować, jeśli trzeba przetestować różne stopnie interaktywności.
Metody w szczegółach
Istnieje kilka metod wykrywania, czy program działa interaktywnie. Poniższa tabela przedstawia przegląd:
Wyniki pochodzą z systemu Ubuntu Linux 11.04 przy użyciu następującego programu:
Urządzenie termiczne
Jeśli sesja interaktywna wymaga pewnych możliwości, możesz otworzyć urządzenie końcowe i (tymczasowo) ustawić potrzebne atrybuty terminala za pośrednictwem
tcsetattr()
.Przykład Pythona
Kod Pythona, który decyduje, czy interpreter działa interaktywnie zastosowań
isatty()
. FunkcjaPyRun_AnyFileExFlags()
wezwania
Py_FdIsInteractive()
który dzwoni
isatty()
.Wniosek
Istnieją różne stopnie interaktywności. Naturalną metodą
stdin
jest sprawdzenie, czy jest podłączony do rury / pliku, czy do rzeczywistego terminalaisatty()
.źródło
Prawdopodobnie sprawdzają typ pliku, w którym znajduje się „stdin” z fstat, coś takiego:
Oczywiście Python jest open source, więc możesz po prostu spojrzeć na to, co robią i wiedzieć na pewno:
http://www.python.org/ftp/python/2.6.2/Python-2.6.2.tar.bz2
źródło
W systemie Windows możesz użyć GetFileType.
źródło
Wywołaj stat () lub fstat () i zobacz, czy S_IFIFO jest ustawione w st_mode.
źródło
Możesz zadzwonić
stat(0, &result)
i sprawdzić!S_ISREG( result.st_mode )
. Ale to Posix, a nie C / C ++.źródło