Ringkasan
Untuk banyak kasus penggunaan, fungsi POSIXisatty()
adalah semua yang diperlukan untuk mendeteksi jika stdin terhubung ke terminal. Contoh minimal:
#include <unistd.h>
#include <stdio.h>
int main(int argc, char **argv)
{
if (isatty(fileno(stdin)))
puts("stdin is connected to a terminal");
else
puts("stdin is NOT connected to a terminal");
return 0;
}
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:
cmd \ metode ctermid buka isatty fstat
――――――――――――――――――――――――――――――――――――――――――――――― ――――――――――
./test / dev / tty OK YES S_ISCHR
./test ≺ test.cc / dev / tty OK TIDAK S_ISREG
cat test.cc | ./test / dev / tty OK TIDAK S_ISFIFO
echo ./test | di / dev / tty FAIL NO S_ISREG
Hasil dari sistem Ubuntu Linux 11.04 menggunakan program berikut:
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>
#include <iostream>
using namespace std;
int main() {
char tty[L_ctermid+1] = {0};
ctermid(tty);
cout << "ID: " << tty << '\n';
int fd = ::open(tty, O_RDONLY);
if (fd < 0) perror("Could not open terminal");
else {
cout << "Opened terminal\n";
struct termios term;
int r = tcgetattr(fd, &term);
if (r < 0) perror("Could not get attributes");
else cout << "Got attributes\n";
}
if (isatty(fileno(stdin))) cout << "Is a terminal\n";
else cout << "Is not a terminal\n";
struct stat stats;
int r = fstat(fileno(stdin), &stats);
if (r < 0) perror("fstat failed");
else {
if (S_ISCHR(stats.st_mode)) cout << "S_ISCHR\n";
else if (S_ISFIFO(stats.st_mode)) cout << "S_ISFIFO\n";
else if (S_ISREG(stats.st_mode)) cout << "S_ISREG\n";
else cout << "unknown stat mode\n";
}
return 0;
}
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()
/* Parse input from a file and execute it */
int
PyRun_AnyFileExFlags(FILE *fp, const char *filename, int closeit,
PyCompilerFlags *flags)
{
if (filename == NULL)
filename = "???";
if (Py_FdIsInteractive(fp, filename)) {
int err = PyRun_InteractiveLoopFlags(fp, filename, flags);
panggilan Py_FdIsInteractive()
/*
* The file descriptor fd is considered ``interactive'' if either
* a) isatty(fd) is TRUE, or
* b) the -i flag was given, and the filename associated with
* the descriptor is NULL or "<stdin>" or "???".
*/
int
Py_FdIsInteractive(FILE *fp, const char *filename)
{
if (isatty((int)fileno(fp)))
return 1;
yang memanggil isatty()
.
Kesimpulan
Ada berbagai tingkat interaktivitas. Untuk memeriksa apakah stdin
terhubung ke pipa / file atau terminal nyata isatty()
adalah metode alami untuk melakukan itu.