• ベストアンサー

fopenでエラーとなる

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

質問者が選んだベストアンサー

  • ベストアンサー
  • noocyte
  • ベストアンサー率58% (171/291)
回答No.3

> fopenの場合、errnoにエラー内容が設定されると理解しています。 > GetLastErrorは、WindowsのAPIを呼び出した場合の使用するものと理解しておりました、 > fopenでエラーが発生した場合でも、GetLastErrorはそのエラーに > マッチしたエラーコードを返してくれるのでしょうか。 仕様として保証されているわけではありませんが, Windows 用の標準Cライブラリは Windows API を呼び出すものもありますから, そこでエラーが発生していれば事実上その情報が得られるので原因究明には役立ちます. fopen() は CreateFile() を呼び出しているので, その中で失敗していれば事実上 GetLastError() でエラー情報が得られます. (fopen() の第2引数が間違っているなど,CreateFile() 以外の原因ならばダメですが.)

tatsu99
質問者

お礼

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

tatsu99
質問者

補足

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

その他の回答 (2)

  • noocyte
  • ベストアンサー率58% (171/291)
回答No.2

#1 さんがおっしゃるように fclose() が失敗している可能性があるので, その戻り値もチェックした方がいいと思います. あと,Windows ということなので,errno だけでなく GetLastError() も チェックした方がもう少し詳しいエラー原因がわかるかも.

tatsu99
質問者

お礼

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

  • nobadymen
  • ベストアンサー率12% (12/100)
回答No.1

ログファイルをいちいちオープンクローズしているということは 何かしらのタイミングで、クローズに失敗していて そのファイルにロックがかかっている状態だと考えられます。 または、クローズしたけど、タイミングが悪くてその時はロックされていたという事も考えられます。 こういう時は何回もトレースして状況を把握するしかないですね。

tatsu99
質問者

お礼

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

関連するQ&A

  • VC++ Exprss:ファイルアクセス拒否

    C言語でのプログラミングを行っています。環境はVC++ Express 2010、XPのSP3です。 バイナリファイルへの書き込みで、errno13、Permission deniedが発生します。 循環リストを読み込み/書き込みをするプログラムです。 以下、エラー発生までの流れです。 1. fopen_s "rb"でファイルをオープン。freadで読み込み。 -存在しなければエラーメッセージを表示して入力処理へ。 -存在する場合は、バイナリデータを構造体ポインタへ読み込む。 2. 構造体への入力処理。 3. "wb"でファイルをオープン。リストの先頭から終端までをfwriteで書き込み。 -存在しない場合は、新規作成。 -存在する場合は、ファイル自体を上書き。(上書きを行う時にのみ、errno13のエラーが発生します。) ファイルはデスクトップに作成しています。 情報に不足があるかもしれませんが、これ以上は思いつかなかったので必要な情報があればご指摘をください。コードを載せたかったのですが、行数が多いので流れを書かせていただきました。 ご教授お願いいたします。

  • fopenでパーミッションエラー

    fopenでパーミッションエラーが出ます。 fopen("../news.htm", "w"); Warning: fopen(../news.htm): failed to open stream: 許可がありません。 fopen("./news.htm", "w"); fopen("../map/news.htm", "w");# mapディレクトリを757にしてOK 上記はOKでした。 ディレクトリ構成は /public_html/sample/mag/test.php # fopenをするファイル sampleを757にしてもエラーが出ました。 fopenで一つ上のディレクトリにファイルを書き込むことは出来ないのでしょうか?

    • 締切済み
    • PHP
  • fopenでのエラー

    こんばんわ、長田と申します。  現在WINNTserverのsp6で動作させるアプリを VC6作成しているのですが同一ファイルを一定周期(数秒)で オープン→ファイル処理→クローズと行っていると あるタイミングでファイルオープンエラーが発生してしまいます。  同一アプリケーションをWIN2000で動作させた場合は 発生しないのでOSに問題があるかと疑っている のですが、どなたかこのような現象に心当たりの ある方はいらっしゃらないでしょうか? ちなみに  ファイルオープンー>fopen()  ファイルクローズ->fclose() を使用しています。 宜しくお願いします。

  • fopen.cの中身について

    いつもお世話になっています。 VS2005でWindowsアプリケーション作成を行っています。 ただいまファイル操作を行っているのですが、あるファイルを読み込みモードでfopenしようとする時点でアプリが中断されてしまい、fopen.cファイルが表示され下記のソースにチャックがされます。 if(*file==_T('\0')) { errno=EINVAL; return NULL; } このソースコードはどういう意味のものなのでしょうか。 エラー解決のため、ご教授お願いいたします。

  • fopenでURL内容の取得のエラー

    fopen(<URLを指定>,'r'); としたときにエラーが発生してしまいます。 この現象は環境によって出る場合と出ない場合があります。 以下はいずれもphpinfo()で取得したPHPとApacheのバージョンです。 <エラーが出ない環境> PHP Version 4.2.3 Apache/1.3.27 <エラーが出る環境> PHP Version 4.3.9 Apache/1.3.31 (Win32) PHP/4.3.9 エラーメッセージは以下のようなものです。 Warning: fopen(<ここにアクセスしたURLが表示>): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in <エラーが出ているプログラムと、fopen()の行が表示> よろしくお願い致します。

    • 締切済み
    • PHP
  • fopenで別ディレクトリにファイルをオープンしたい

     LinuxでC言語のプログラムを作っています。書き込みでファイルをオープンする際に、別のディレクトリにファイルを作成したいのです。しかし普通にターミナルの上でやるような指定の仕方だとうまくいきません。  以前にWindows環境でfopenの際のパス指定の質問があったみたいですが、Linuxではどのように指定したらいいでしょう…?よろしくお願いします。

  • CentOS + apache で403エラー

    CentOS + apache で403エラー CentOS5.4とapache2.2でwebサーバを構成中ですが、 全てのページで403エラーが返ってきます。 いろいろ試してみましたが、 ルートディレクトリの/var/www/htmlを作成し直した際に、 何故か一度だけ動きました。理由は不明です。 その後OSを再起動した後は また見られない状態にもどっています。 どなたか分かる方、アドバイスをお願いします。 以下の事は試してみました。 ==================================================== 1. apache,osの再起動。 2. iptables停止 3. ブラウザ表示 > You don't have permission to access / on this server. /etc/httpd/logs/error_log 表示 > Permission denied: /var/www/html/.htaccess pcfg_openfile: unable to check htaccess file, ensure it is readable だったので、ルートディレクトリ以下全てのパーミッションを777に、 それまではディレクトリ755、ファイル644 4. /var/www/htmlから、.htaccessを削除、テスト用index.htmlを作成 ブラウザ表示 > You don't have permission to access / on this server. > Additionally, a 403 Forbidden error was encountered while trying to use an ErrorDocument to handle the request. error_log > Permission denied: access to /error/noindex.html denied /var/www/error/noindex.htmlのパーミッションは755です。 ======================================================= 以上です。宜しくお願いします。

  • fopenが動作しない

    PHPで、別のファイルで取得したファイル名をもとに fopenを使ってファイルを開こうとしているのですが、 どうしてもうまくいきません。 具体的な症状は以下のとおりです。 a.phpの中で、 … $file[2] = "hoge02.xml"; … のように、配列にファイル名を代入します。 これを b.php で require_once('a.php'); とした後 print_r($file); とすると Array([0] => … [2] => "hoge02.xml" [3]…) のように表示されるところまでは確認できました。 しかし、 $file0 = $file[2]; $fp = fopen("$file0", 'r'); とすると Warning: fopen( "hoge02.xml" ) [function.fopen]: failed to open stream: Invalid argument in [b.php の絶対アドレス] とエラーが出てしまい、実行することが出来ません。 そこで、 //$file0 = $file[2]; $file0 = "hoge02.xml"; $fp = fopen("$file0",'r'); とすると実行することが出来ました。 作成しているシステム上、fopenの1つ目の引数には変数または配列を使いたいのですが、 エラーが発生してどうしてもうまくいきません。 自分なりにも似たようなエラーがないか調べたのですが、 それらしいものを見つけることが出来ず、お手上げ状態です。 どなたか解決策をご存じないでしょうか。 ご教授の程、よろしくお願い致します。

    • 締切済み
    • PHP
  • fopen()関数

    こんにちは。 PHPで、fopen()関数を使用し、別ファイルにでーたを保存しているのですが、 fopen ("ファイル名", "a"); とやると、ファイルに追記されますよね。 この追記を、ファイルの一番最初に行いたいのです。 一番最初に書き込みをできるということで、 fopen ("ファイル名", "r+"); なども試してみたのですが、 その追記された文字数だけ最初側の文字が消えてしまい、追記は無理でした。 rewind()関数も使用したのですが、ダメでした。 何方か、ファイルの最初に、既に書き込まれている文字を消さずに追記する方法をご教授くだされば幸いです。

    • ベストアンサー
    • PHP
  • fopenの使い方

    Cのfopenを使用する際、開くファイル名をプログラム中に書くのでなく、プログラム実行時にキーボードで打ち込んだ文字をファイル名とするプログラムの書き方を教えてください。 出来れば参考にしたいため、簡単なもので良いのでプログラムも書いていただけると、うれしいです。 よろしくお願いいたします。

専門家に質問してみよう