最近 C でプログラムを書いていて、奇妙な現象に悩んでいた。
それは、出力を端末画面に流したり、コマンドラインで指定したファイルに書き出すのは可能なのだが、リダイレクトすると落ちる、というもの。
他の深刻なバグに比べると、回避方法もある些末なバグなので、謎のまま放置していた。
今日、別の現象を追いかけていたら、閉じていないファイル記述子がいっぱいあることに気付いた。
そして、それを閉じると、なんと件の現象は起こらなくなった。
つまり、開いていいファイル記述子が個数の限界に達してしまっていたので、リダイレクト先として新たにファイルを開こうとすると、失敗する。
ファイル記述子が開けないので、そこに書き込めるわけもなく、死ぬ。
ということが多分起こっていたのだろう。
|