özet
Çoğu kullanım durumu için POSIX işlevi isatty(), stdin'in bir terminale bağlı olup olmadığını saptamak için gereken tek şeydir. Minimal bir örnek:
#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;
}
Aşağıdaki bölüm, farklı etkileşim derecelerinin test edilmesi gerektiğinde kullanılabilecek farklı yöntemleri karşılaştırmaktadır.
Ayrıntılı Yöntemler
Bir programın etkileşimli olarak çalışıp çalışmadığını algılamanın birkaç yöntemi vardır. Aşağıdaki tablo bir genel bakış göstermektedir:
cmd \ method ctermid açık isatty fstat
-------------------------------------------------- ----------
./test / dev / tty TAMAM EVET S_ISCHR
./test ≺ test.cc / dev / tty TAMAM HAYIR S_ISREG
kedi test.cc | ./test / dev / tty TAMAM HAYIR S_ISFIFO
yankı ./test | şu anda / dev / tty BAŞARISIZ HAYIR S_ISREG
Sonuçlar, aşağıdaki programı kullanan bir Ubuntu Linux 11.04 sisteminden alınmıştır:
#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;
}
Termimal cihaz
Etkileşimli oturumun belirli yeteneklere ihtiyacı varsa, terminal cihazını açabilir ve (geçici olarak) ihtiyacınız olan terminal özelliklerini ayarlayabilirsiniz tcsetattr().
Python Örneği
Tercüman etkileşimli çalışır karar verir Python kodu kullanır isatty(). İşlevPyRun_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);
aramalar 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;
hangi aramalar isatty().
Sonuç
Farklı derecelerde etkileşim vardır. stdinBir boruya / dosyaya veya gerçek bir terminale bağlı olup olmadığını kontrol etmek isatty(), bunu yapmak için doğal bir yöntemdir.