

fopenを使用してログファイルへ書き込み時に、errno=13 Permission denied のエラーがまれに発生するときがあります。
ログファイルは、1ログを書く毎に、その都度、オープン/クローズしています。fopenの第二引数は"a+t"を指定しています。(テキストモード追加書き込み。+を指定している理由は、更新は行いませんが、Ctrl-Zの削除の為、+を指定することがマイクロソフトにより推奨されているため)
もちろん、このログファイル(ディレクトリ含む)への書き込み権限がないということは、ありません。(あれば必ず発生しますので)
従って一時的に、書き込み不能となる状態が発生していると考えられます。エラーが発生した後も、一定の時間が経過した後には書き込めるようになります。
このような事象に遭遇したことのあるかたが、おりましたら、その旨回答下さい。又、解決方法(このような事態をさける方法)をご存じのかたがおりましたら、教えて下さい。
実行環境
Windows2003-server
開発環境
Visual Studio .NET 2003のC++による開発(コードの内容は実質的にC言語を使用、MFCは使用していません)
No.3ベストアンサー
- 回答日時:
> fopenの場合、errnoにエラー内容が設定されると理解しています。
> GetLastErrorは、WindowsのAPIを呼び出した場合の使用するものと理解しておりました、
> fopenでエラーが発生した場合でも、GetLastErrorはそのエラーに
> マッチしたエラーコードを返してくれるのでしょうか。
仕様として保証されているわけではありませんが,
Windows 用の標準Cライブラリは Windows API を呼び出すものもありますから,
そこでエラーが発生していれば事実上その情報が得られるので原因究明には役立ちます.
fopen() は CreateFile() を呼び出しているので,
その中で失敗していれば事実上 GetLastError() でエラー情報が得られます.
(fopen() の第2引数が間違っているなど,CreateFile() 以外の原因ならばダメですが.)
この回答への補足
今までの回答ありがとうございました。
これから外出しますので、お礼は夜になりますが、なにか気づいた点があれば、ご指摘をお願いします。
>fopen() は CreateFile() を呼び出しているので,
>その中で失敗していれば事実上 GetLastError() でエラー情報が得られます.
貴重な情報をありがとうございました。試してみます。
No.2
- 回答日時:
#1 さんがおっしゃるように fclose() が失敗している可能性があるので,
その戻り値もチェックした方がいいと思います.
あと,Windows ということなので,errno だけでなく GetLastError() も
チェックした方がもう少し詳しいエラー原因がわかるかも.
回答ありがとうございます。
>#1 さんがおっしゃるように fclose() が失敗している可能性があるので,その戻り値もチェックした方がいいと思います.
戻り値は、チェックしております。
エラーがあった場合、別途エラーが、別経路ででますので、この可能性は排除しています。
>あと,Windows ということなので,errno だけでなく GetLastError() もチェックした方がもう少し詳しいエラー原因がわかるかも.
fopenの場合、errnoにエラー内容が設定されると理解しています。
GetLastErrorは、WindowsのAPIを呼び出した場合の使用するものと理解しておりました、fopenでエラーが発生した場合でも、GetLastErrorはそのエラーにマッチしたエラーコードを返してくれるのでしょうか。
No.1
- 回答日時:
ログファイルをいちいちオープンクローズしているということは
何かしらのタイミングで、クローズに失敗していて
そのファイルにロックがかかっている状態だと考えられます。
または、クローズしたけど、タイミングが悪くてその時はロックされていたという事も考えられます。
こういう時は何回もトレースして状況を把握するしかないですね。
回答ありがとうございます。
>何かしらのタイミングで、クローズに失敗していて
>そのファイルにロックがかかっている状態だと考えられます。
>または、クローズしたけど、タイミングが悪くてその時はロックされていたという事も考えられます。
現在、このエラーが発生しているプロセスは、非常中プロセスで、このプロセスが、このプロセス専用のログファイルをオープンした時に、このエラーが発生しています。従って、クローズエラーであっても、プロセス自体が終了しますので、ログファイルがロックされることはないと考えておりました。
しかしながら、全く第三者によってロックされる可能性もありえますので(本来あってはならないのですが)、その点を検討してみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C# try-catch でcatchに飛ばす方法
-
winsock通信時エラーの回避
-
ASP 0x80004005 クライアント...
-
EXECLマクロでshapeがグルーフ...
-
FileCopy時のエラー
-
ASP.net の OnClientClick
-
CreateObject("Excel.Applicati...
-
SQLサーバーへの接続に 接...
-
CreateProcessでアプリケーショ...
-
PHP実行のエラー
-
VBA RemoveDuplicatesで「アプ...
-
C++でSQLServer2008に接続
-
ネットワーク上のPCのIPとホス...
-
式はメソッドではありませんと...
-
名前が二重に定義されています
-
Response.Redirectで引数2つの...
-
AutoPostBackにしているが、う...
-
VBSにてサーバー中のエクセルフ...
-
VBSでIEを起動し、拡大率を変更...
-
.html ファイルでasp実行?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C# try-catch でcatchに飛ばす方法
-
EXECLマクロでshapeがグルーフ...
-
FileCopy時のエラー
-
CreateObject("Excel.Applicati...
-
ASP 0x80004005 クライアント...
-
このページの状態情報は無効で...
-
オラクル接続をopenしようとす...
-
VB6でRDOに接続できない
-
オーバーフローが発生します
-
fopenでエラーとなる
-
インストールエラーが解決できない
-
内部関数のエラーを外部に
-
エラー 'ASP 0115'
-
エラー内容について
-
IIS7.5の設定の仕方
-
ADSIについて
-
Outlookで添付ファイルの有無を...
-
winsock通信時エラーの回避
-
インクルードしたファイルの関...
-
ペ-ジでエラ-が発生しました
おすすめ情報