こんにちは、伊藤です。 FreeBSDの5.3Rから、5.5Rあたりで使われているtcsh(csh)は、 6.13.00というバージョンなのですが、このバージョンにはファイル ディスクリプタをリークするというバグがあることに気付きました。 (もしかして、知らなかったの私だけ?)
このバグは、tcshの6.14.00では改修されています。 6系列は、tcshのバージョンが6.14.00なので大丈夫です。 4系列は、tcshのバージョンが6.12.00なので大丈夫です。 バグの発現方法は、コマンドラインから、 # echo $aaa > /dev/null や、 # echo "AAA" > /dev/null や、 # set > /tmp/log.txt の様に、シェルの内部コマンドの出力をリダイレクトした場合、 その度に1つずつファイルディスクプリタを消費して行きます。 上記コマンドを実行後、fstatで、tcshのオープンしているファイル を眺めて見ると、どんどん増えていきます。 通常、インタラクティブな用途で使用してるぶんには、あまり大きな 影響は無いかもしれませんが、このバグが顕在化するようなcshの シェルスクリプトを延々実行させていると何かと、不都合な事が 発生するかも知れません。(kern.maxfiles超えたり) とりあえず、パッチを付けておきますが、これってsend-prした方が 良いんでしょうか?(どうせ、6系列では直ってる事だし。) contribの下って事もあり、どう扱えば良いものか悩んでいます。 *** sh.sem.c Wed Aug 30 23:09:20 2006 --- sh.sem.c.orig Wed Aug 30 23:08:36 2006 *************** *** 863,869 **** stderror(ERR_SYSTEM, tmp, strerror(errno)); /* allow input files larger than 2Gb */ #ifndef WINNT_NATIVE ! (void) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_LARGEFILE); #endif /*!WINNT_NATIVE*/ (void) dmove(fd, 0); } --- 863,869 ---- stderror(ERR_SYSTEM, tmp, strerror(errno)); /* allow input files larger than 2Gb */ #ifndef WINNT_NATIVE ! (void) fcntl(fd, O_LARGEFILE, 0); #endif /*!WINNT_NATIVE*/ (void) dmove(fd, 0); } *************** *** 923,929 **** stderror(ERR_SYSTEM, tmp, strerror(errno)); /* allow input files larger than 2Gb */ #ifndef WINNT_NATIVE ! (void) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_LARGEFILE); #endif /*!WINNT_NATIVE*/ } (void) dmove(fd, 1); --- 923,929 ---- stderror(ERR_SYSTEM, tmp, strerror(errno)); /* allow input files larger than 2Gb */ #ifndef WINNT_NATIVE ! (void) fcntl(fd, O_LARGEFILE, 0); #endif /*!WINNT_NATIVE*/ } (void) dmove(fd, 1);