Ketika saya mengeksekusi " python
" dari terminal tanpa argumen, ia menampilkan shell interaktif Python.
Saat saya mengeksekusi " cat | python
" dari terminal, mode interaktif tidak diluncurkan. Entah bagaimana, tanpa mendapatkan masukan apa pun, ia telah mendeteksi bahwa ia terhubung ke pipa.
Bagaimana saya melakukan deteksi serupa di C atau C ++ atau Qt?
Jawaban:
Penggunaan
isatty
:(Pada jendela mereka diawali dengan garis bawah:
_isatty
,_fileno
)sumber
io.h
dan untukisatty()
Anda perlu menyertakanunistd.h
.less
.Ringkasan
Untuk banyak kasus penggunaan, fungsi POSIX
isatty()
adalah semua yang diperlukan untuk mendeteksi jika stdin terhubung ke terminal. Contoh minimal:Bagian berikut membandingkan metode berbeda yang dapat digunakan jika tingkat interaktivitas yang berbeda harus diuji.
Metode secara Detail
Ada beberapa metode untuk mendeteksi jika suatu program berjalan secara interaktif. Tabel berikut menunjukkan gambaran umum:
Hasil dari sistem Ubuntu Linux 11.04 menggunakan program berikut:
Perangkat termimal
Jika sesi interaktif membutuhkan kemampuan tertentu, Anda dapat membuka perangkat terminal dan (sementara) mengatur atribut terminal yang Anda perlukan melalui
tcsetattr()
.Contoh Python
The kode Python yang memutuskan apakah penafsir berjalan secara interaktif menggunakan
isatty()
. FungsiPyRun_AnyFileExFlags()
panggilan
Py_FdIsInteractive()
yang memanggil
isatty()
.Kesimpulan
Ada berbagai tingkat interaktivitas. Untuk memeriksa apakah
stdin
terhubung ke pipa / file atau terminal nyataisatty()
adalah metode alami untuk melakukan itu.sumber
Mungkin mereka memeriksa jenis file yang "stdin" dengan fstat, seperti ini:
Tentu saja Python adalah open source, jadi Anda bisa melihat apa yang mereka lakukan dan mengetahui dengan pasti:
http://www.python.org/ftp/python/2.6.2/Python-2.6.2.tar.bz2
sumber
Di Windows, Anda dapat menggunakan GetFileType.
sumber
Panggil stat () atau fstat () dan lihat apakah S_IFIFO disetel di st_mode.
sumber
Anda dapat menelepon
stat(0, &result)
dan memeriksa!S_ISREG( result.st_mode )
. Itu Posix, bukan C / C ++.sumber