ファイヤープロジェクト
リダイレクトされているかどうか知りたい
2003-07-20T15:13+09:00   matsu
出力がリダイレクトされているかどうかを調べる.これはファイルディスクリプタをチェックすればわかる.
ファイルディスクリプタからリダイレクト先が端末かどうかを調べるには,isattyシステムコールを使用する.これはunistd.hで宣言されている.そしてファイルディスクリプタはfileno関数で取得できる.
これを実行すると以下のようになる.
$> ./a.out 
stdout is a terminal

$> ./a.out > /dev/null 
stdout is not a terminal
簡単.
先のサンプルでは,stdoutがリダイレクトされているかどうかをチェックしてその結果をstderrに出力した.この方法では,stderrがリダイレクトされていると,端末には何も表示されない.stdoutやstderrのリダイレクトにかかわらず端末に表示するには,/dev/ttyをオープンしてそれに書き込む./dev/ttyは現在の端末を意味し,通常のファイルと同様に読み書きができる.先のサンプルを変更してstdoutとstderrがリダイレクトされているかどうかをチェックするようにしみた.
実行結果を以下に示す.
$ ./a.out 
stdout is a terminal
stderr is a terminal

$ ./a.out > hoge
stdout is not a terminal
stderr is a terminal

$ ./a.out 2> hoge
stdout is a terminal
stderr is not a terminal

$ ./a.out &> hoge
stdout is not a terminal
stderr is not a terminal
matsu(C)
Since 2002
Mail to matsu