アプリ版:「スタンプのみでお礼する」機能のリリースについて

fopenを使用してログファイルへ書き込み時に、errno=13 Permission denied のエラーがまれに発生するときがあります。
ログファイルは、1ログを書く毎に、その都度、オープン/クローズしています。fopenの第二引数は"a+t"を指定しています。(テキストモード追加書き込み。+を指定している理由は、更新は行いませんが、Ctrl-Zの削除の為、+を指定することがマイクロソフトにより推奨されているため)
もちろん、このログファイル(ディレクトリ含む)への書き込み権限がないということは、ありません。(あれば必ず発生しますので)
従って一時的に、書き込み不能となる状態が発生していると考えられます。エラーが発生した後も、一定の時間が経過した後には書き込めるようになります。
このような事象に遭遇したことのあるかたが、おりましたら、その旨回答下さい。又、解決方法(このような事態をさける方法)をご存じのかたがおりましたら、教えて下さい。

実行環境
Windows2003-server
開発環境
Visual Studio .NET 2003のC++による開発(コードの内容は実質的にC言語を使用、MFCは使用していません)

A 回答 (3件)

> fopenの場合、errnoにエラー内容が設定されると理解しています。


> GetLastErrorは、WindowsのAPIを呼び出した場合の使用するものと理解しておりました、
> fopenでエラーが発生した場合でも、GetLastErrorはそのエラーに
> マッチしたエラーコードを返してくれるのでしょうか。

仕様として保証されているわけではありませんが,
Windows 用の標準Cライブラリは Windows API を呼び出すものもありますから,
そこでエラーが発生していれば事実上その情報が得られるので原因究明には役立ちます.

fopen() は CreateFile() を呼び出しているので,
その中で失敗していれば事実上 GetLastError() でエラー情報が得られます.
(fopen() の第2引数が間違っているなど,CreateFile() 以外の原因ならばダメですが.)

この回答への補足

今までの回答ありがとうございました。
これから外出しますので、お礼は夜になりますが、なにか気づいた点があれば、ご指摘をお願いします。

補足日時:2007/06/12 11:25
    • good
    • 0
この回答へのお礼

>fopen() は CreateFile() を呼び出しているので,
>その中で失敗していれば事実上 GetLastError() でエラー情報が得られます.
貴重な情報をありがとうございました。試してみます。

お礼日時:2007/06/12 11:20

#1 さんがおっしゃるように fclose() が失敗している可能性があるので,


その戻り値もチェックした方がいいと思います.

あと,Windows ということなので,errno だけでなく GetLastError() も
チェックした方がもう少し詳しいエラー原因がわかるかも.
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
>#1 さんがおっしゃるように fclose() が失敗している可能性があるので,その戻り値もチェックした方がいいと思います.
戻り値は、チェックしております。
エラーがあった場合、別途エラーが、別経路ででますので、この可能性は排除しています。
>あと,Windows ということなので,errno だけでなく GetLastError() もチェックした方がもう少し詳しいエラー原因がわかるかも.
fopenの場合、errnoにエラー内容が設定されると理解しています。
GetLastErrorは、WindowsのAPIを呼び出した場合の使用するものと理解しておりました、fopenでエラーが発生した場合でも、GetLastErrorはそのエラーにマッチしたエラーコードを返してくれるのでしょうか。

お礼日時:2007/06/12 10:54

ログファイルをいちいちオープンクローズしているということは


何かしらのタイミングで、クローズに失敗していて
そのファイルにロックがかかっている状態だと考えられます。
または、クローズしたけど、タイミングが悪くてその時はロックされていたという事も考えられます。

こういう時は何回もトレースして状況を把握するしかないですね。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
>何かしらのタイミングで、クローズに失敗していて
>そのファイルにロックがかかっている状態だと考えられます。
>または、クローズしたけど、タイミングが悪くてその時はロックされていたという事も考えられます。
現在、このエラーが発生しているプロセスは、非常中プロセスで、このプロセスが、このプロセス専用のログファイルをオープンした時に、このエラーが発生しています。従って、クローズエラーであっても、プロセス自体が終了しますので、ログファイルがロックされることはないと考えておりました。
しかしながら、全く第三者によってロックされる可能性もありえますので(本来あってはならないのですが)、その点を検討してみます。

お礼日時:2007/06/12 10:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています