- ベストアンサー
fopenでエラーとなる
fopenを使用してログファイルへ書き込み時に、errno=13 Permission denied のエラーがまれに発生するときがあります。 ログファイルは、1ログを書く毎に、その都度、オープン/クローズしています。fopenの第二引数は"a+t"を指定しています。(テキストモード追加書き込み。+を指定している理由は、更新は行いませんが、Ctrl-Zの削除の為、+を指定することがマイクロソフトにより推奨されているため) もちろん、このログファイル(ディレクトリ含む)への書き込み権限がないということは、ありません。(あれば必ず発生しますので) 従って一時的に、書き込み不能となる状態が発生していると考えられます。エラーが発生した後も、一定の時間が経過した後には書き込めるようになります。 このような事象に遭遇したことのあるかたが、おりましたら、その旨回答下さい。又、解決方法(このような事態をさける方法)をご存じのかたがおりましたら、教えて下さい。 実行環境 Windows2003-server 開発環境 Visual Studio .NET 2003のC++による開発(コードの内容は実質的にC言語を使用、MFCは使用していません)
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> fopenの場合、errnoにエラー内容が設定されると理解しています。 > GetLastErrorは、WindowsのAPIを呼び出した場合の使用するものと理解しておりました、 > fopenでエラーが発生した場合でも、GetLastErrorはそのエラーに > マッチしたエラーコードを返してくれるのでしょうか。 仕様として保証されているわけではありませんが, Windows 用の標準Cライブラリは Windows API を呼び出すものもありますから, そこでエラーが発生していれば事実上その情報が得られるので原因究明には役立ちます. fopen() は CreateFile() を呼び出しているので, その中で失敗していれば事実上 GetLastError() でエラー情報が得られます. (fopen() の第2引数が間違っているなど,CreateFile() 以外の原因ならばダメですが.)
その他の回答 (2)
- noocyte
- ベストアンサー率58% (171/291)
#1 さんがおっしゃるように fclose() が失敗している可能性があるので, その戻り値もチェックした方がいいと思います. あと,Windows ということなので,errno だけでなく GetLastError() も チェックした方がもう少し詳しいエラー原因がわかるかも.
お礼
回答ありがとうございます。 >#1 さんがおっしゃるように fclose() が失敗している可能性があるので,その戻り値もチェックした方がいいと思います. 戻り値は、チェックしております。 エラーがあった場合、別途エラーが、別経路ででますので、この可能性は排除しています。 >あと,Windows ということなので,errno だけでなく GetLastError() もチェックした方がもう少し詳しいエラー原因がわかるかも. fopenの場合、errnoにエラー内容が設定されると理解しています。 GetLastErrorは、WindowsのAPIを呼び出した場合の使用するものと理解しておりました、fopenでエラーが発生した場合でも、GetLastErrorはそのエラーにマッチしたエラーコードを返してくれるのでしょうか。
- nobadymen
- ベストアンサー率12% (12/100)
ログファイルをいちいちオープンクローズしているということは 何かしらのタイミングで、クローズに失敗していて そのファイルにロックがかかっている状態だと考えられます。 または、クローズしたけど、タイミングが悪くてその時はロックされていたという事も考えられます。 こういう時は何回もトレースして状況を把握するしかないですね。
お礼
回答ありがとうございます。 >何かしらのタイミングで、クローズに失敗していて >そのファイルにロックがかかっている状態だと考えられます。 >または、クローズしたけど、タイミングが悪くてその時はロックされていたという事も考えられます。 現在、このエラーが発生しているプロセスは、非常中プロセスで、このプロセスが、このプロセス専用のログファイルをオープンした時に、このエラーが発生しています。従って、クローズエラーであっても、プロセス自体が終了しますので、ログファイルがロックされることはないと考えておりました。 しかしながら、全く第三者によってロックされる可能性もありえますので(本来あってはならないのですが)、その点を検討してみます。
お礼
>fopen() は CreateFile() を呼び出しているので, >その中で失敗していれば事実上 GetLastError() でエラー情報が得られます. 貴重な情報をありがとうございました。試してみます。
補足
今までの回答ありがとうございました。 これから外出しますので、お礼は夜になりますが、なにか気づいた点があれば、ご指摘をお願いします。