ioctlシステムコールにTCGETSを渡すことで、指定のファイルディスクリプタの指す端末情報を取得できる。
これを使うと、リダイレクトによるファイル出力か、標準入出力かを判定できる。
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