1

C ++では、開いているファイルがシンボリックリンクを介してリダイレクトされているかどうかを確認するにはどうすればよいですか?これが私のファイルオープナーハンドラーです:

 f=fopen(addr.c_str(), "rb");

前もって感謝します

4

2 に答える 2

2

のフィールドを調べlstatて確認します。st_modestruct statS_IFLNK

于 2010-11-21T10:54:53.383 に答える
2

stat()を使用すると、自動的にシンボリックリンクをたどります。fstat()を使用する場合、ファイル記述子を取得するためにファイルが開かれるため、シンボリックリンクはすでに追跡されています。

lstat()は、シンボリックリンクをたどらないため、この特定のケースではstat()およびfstat()よりも推奨されます。lstat()を呼び出した後、open()を呼び出します。ただし、この方法には固有の競合状態の問題があります。lstat()とopen()の呼び出しの間に別のプロセス/スレッド/タスクが発生し、ファイルをシンボリックリンクに変更する可能性があります。

幸い、この競合状態に対する解決策があります。open()でファイルを開く場合、フラグO_NOFOLLOWを使用できる場合があります。これにより、open()にシンボリックリンクがある場合はそれをたどらないように指示されます。ただし、開いたファイルがシンボリックリンクであったかどうか(ただし、フォローされていないかどうか)を知る必要があります。これを行うには、open()から返されたファイル記述子をfstat()とともに使用します。

お役に立てれば。

于 2010-11-21T12:35:39.933 に答える