TCGETS

ioctlシステムコールにTCGETSを渡すことで、指定のファイルディスクリプタの指す端末情報を取得できる。

Man page of TTY_IOCTL

これを使うと、リダイレクトによるファイル出力か、標準入出力かを判定できる。

TCGETS1.cは標準出力について判定するものである。

TCGETS0.cは標準入力について判定するものである。
端末情報取得が成功ならtermios構造体のttyに端末情報が入る。
どちらもリダイレクトすると、-1が返る。

$ vi TCGETS1.c
$ gcc TCGETS1.c -o TCGETS1
$ ./TCGETS1
ABCDE
success
$ ls
TCGETS1  TCGETS1.c
$ ./TCGETS1 > test.txt
failure
$ cat test.txt
ABCDE
$ vi TCGETS0.c
$ gcc TCGETS0.c -o TCGETS0
$ ./TCGETS0
abc
success
buf = abc
$ ./TCGETS0 < test.txt
failure
buf = ABCDE
$

リダイレクトすると、端末ではなくファイルとなるため、失敗する。

Sample/unixsyscall/TCGETS/TCGETS/src/TCGETS at master · bg1bgst333/Sample · GitHub