3

私のプログラムは、gcc バージョン 4.4.7 でコンパイルされた Linux 環境で実行されています。

realpath()ファイルパスを「正規化」するために使用しています。フィード先のすべてのディレクトリとファイルのパスはrealpath()確実に存在します。これはもちろん、realpath()適切に機能するために不可欠です。

ただし、エラー コード 17、名前、文字列の説明「ファイルが存在します」 realpath()で失敗することがあります。EEXIST

それは私を困惑させます。もちろんあります、と叫びrealpath()ます。しかしrealpath()、私の怒鳴り声には動じません。

http://pubs.opengroup.org/onlinepubs/009695399/functions/realpath.htmlのドキュメントにはrealpath()、失敗の原因となるエラーがリストされていますが、それらのエラーの 1 つではありません。EEXIST

なぜrealpath()このように失敗するのですか?

エラーの原因となるディレクトリとファイル パスの例EEXIST:

  • ディレクトリへの絶対パス: /alpha/bravo/charlie/delta
  • ファイルへの絶対パス: /alpha/bravo/charlie/foo.txt
  • ファイルへの相対パス: ../../charlie/foo.txt
  • 余分なドットを含むファイルへのパス: /alpha/bravo/Charlie/./foo.txt

ただし、これらの例は決定的なものではありません。まったく同じパターンを持ち、同じディレクトリにある他のファイルは成功するからです。

EEXISTどのディレクトリまたはファイルがエラーを引き起こすかについて、韻や理由はないようです。エラーは通常、正規化しようとした最初のファイル パスでのみ発生し、その後のファイル パスでは発生しません。ただし、その最初のファイルを再度正規化しようとするだけでは、その周りをこじ開けることはできません。エラーはそれだけで発生し続けます。

プログラムの抜粋:

#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <limits.h>    // for PATH_MAX

using std;

string PathCanonicalize( string const & path )
{
  string result;

  char szResult[ PATH_MAX ];
  ::realpath( path.c_str(), szResult );
  if ( errno == EEXIST )
  {
    // Why?
    cerr << "realpath: error code " << errno << ", " << ::strerror( errno ) << ": '" << path << "'.  Of course the file exists!" << endl;

    result = path;
  }
  else if ( errno )
  {
    cerr << "realpath: error code " << errno << ", " << ::strerror( errno ) << ": '" << path << "'" << endl;

    result = path;
  }
  else
  {
    result = szResult;
  }

  return result;      
}
4

2 に答える 2

7

errno特別な理由がない限り、絶対にチェックしないでください。

おそらく、realpath最後に行われた内部操作はEEXIST. または、失敗して変更されなかった以前の操作からerrnoたまたま発生した可能性があります。EEXISTrealpath

これがrealpath失敗の原因ではない場合、なぜ気にしますか?

あなた自身のリンクから:

正常に完了すると、realpath() は解決された名前へのポインターを返します。それ以外の場合、realpath() は null ポインタを返し、エラーを示すために errno を設定し、resolved_name が指すバッファの内容は未定義です。

成功したerrno場合、特に何かに設定されているとは言っていないことに注意してください。では、成功したかどうかを確認する前に確認するrealpathのはなぜですか?errnorealpath

于 2015-06-04T17:21:30.900 に答える