2011-06-21 113 views
2

私は主に動作するアプリケーションを持っていますが、:: popen()の呼び出しでerrnoをENOMEMに設定してエラーが発生する条件が1つあります。 ::のpopen()のmanページはのために::自体は、Linux上でこの短いコメントでENOMEMを示していますフォーク()のページにあなたを参照:ENOMEMの原因:: popen()

The fork() function may fail if: 

    ENOMEM Insufficient storage space is available. 

私は本当にメモリが不足していた場合、私は疑問に思って、またはおそらくファイル記述子のような他のリソースですか? fork()はENOMEMにあなたのシステムの実際のメモリを使い果たしている以外のものを与えることができますか?これはCentos4です。

+0

? pipe(2)はどこからfork(2)を参照していますか?そしてfork()のエラーがpipe()に関係するのはなぜですか? – bdonlan

+0

おっと、それを捕まえてくれてありがとう、それはパイプではなく、ポープンです。 – WilliamKF

+1

['strace(1)'](http://linux.die.net/man/1/strace)は何が起きていると言いますか? 'popen(3)'は 'pipe(2)'と 'fork(2)'を内部的に呼び出します。どの呼出しが 'ENOMEM'、' pipe'または 'fork'を返していますか? –

答えて

1

ENOMEMは、repeated :: popen()の後に:: pclose()を呼び出していないことに起因し、最終的にファイル記述子が不足していることが原因であることを確認しました。

+1

文書には、 'ENOMEM'ではなく' EMFILE'または 'ENFILE'でなければならないことが示唆されています。私は、@ Adamの提案をstraceの下で実行して、どのシステムコールが実際にエラーを出したかを知る必要があると思います。なぜなら、これは非常に奇妙に聞こえるからです。 – Nemo

関連する問題