4

getcwd()現在の作業ディレクトリを取得するために使用しているビルド システム ツールがあります。これは素晴らしいことですが、パスにスペースが含まれている場合があり、これはビルド システムではサポートされていません。シンボリックリンクを作成するだけでよいと思うでしょう:

ln -s "Directory With Spaces" DirectoryWithoutSpaces

そして幸せになってください。しかし、残念ながら、getcwd()すべてのシンボリック リンクを解決します。を使用しようとしましgetenv("PWD")たが、 から戻るのと同じパスを指していませんgetcwd()。環境変数を更新しなかったことのせいmake -Cだと思います。現在、getcwd()次のようなパスが返されます。

/Users/carl/Directory With Spaces/Some/Other/Directories

そしてgetenv("PWD")私に与えます:

/Users/carl/DirectoryWithoutSpaces

それでgetcwd()、シンボリックリンクを解決しないような関数はありますか?

編集:

私が変更され

make -C Some/Other/Directories

cd Some/Other/Directories ; make

そして、getenv("PWD")動作します..他に解決策がない場合は、それを使用できます。

4

2 に答える 2

6

StevensによるUNIX環境聖書のAdvancedProgrammingによると、p.112:

カーネルは現在の作業ディレクトリの知識を維持する必要があるため、現在の値をフェッチできるはずです。残念ながら、各プロセスでカーネルが維持するのは、現在の作業ディレクトリのiノード番号とデバイスIDだけです。カーネルはディレクトリのフルパス名を維持しません。

申し訳ありませんが、別の方法でこれを回避する必要があるようです。

于 2010-07-17T01:24:45.833 に答える
3

getcwd()シンボリックリンクを介してたどったパスを判別する方法はありません。getcwd()statsの基本的な実装では、現在のディレクトリ' .'を開き、親ディレクトリ' ..'を開き、''と同じiノード番号を持つディレクトリ名が見つかるまでエントリをスキャンします.。次に、ルートディレクトリが見つかるまでこのプロセスを上向きに繰り返します。ルートディレクトリには、フルパスがあります。シンボリックリンクを通過することはありません。したがって、getcwd()システムコールとして実装されているか、ライブラリ関数として実装されているかにかかわらず、シンボリックリンクを介してたどるパスを計算するという目標は不可能です。

最善の解決策は、ビルドシステムがスペースを含むパス名を確実に処理するようにすることです。これは、シェルを通過したパス名を引用することを意味します。Cプログラムは、名前のスペースを気にしません。問題が発生するのは、シェルのようなプログラムが文字列を解釈するときだけです。(プリプロセッサを実行するシェルスクリプトとして実装されたコンパイラは、多くの場合、スペースを含むパス名に問題があります-経験から言えば。)

于 2010-07-17T04:37:41.670 に答える