Getcwd()とgetenv("PWD")が一致しない場合はどうすればよいですか?
質問
私は使用しているビルドシステムツールを持っています 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")
作品。.他に解決策がない場合は、それを使用できます。
解決
Stevens、P.112:
によるUNIX環境聖書の高度なプログラミングによるとカーネルは現在の作業ディレクトリの知識を維持する必要があるので、現在の値を取得できるはずです。残念ながら、各プロセスに対してすべてのカーネル管理は、現在の作業ディレクトリのIノード番号とデバイス識別です。カーネルはディレクトリのフルパス名を維持しません。
申し訳ありません、あなたが別の方法でこれを回避する必要があるように見えます。
他のヒント
のための方法はありません getcwd()
シンボリックリンクを介してたどったパスを決定します。の基本的な実装 getcwd()
現在のディレクトリを統計する'.
'、その後、親ディレクトリを開きます'..
'と同じinode番号を持つディレクトリ名が見つかるまでエントリをスキャンします'.
'持っています。その後、ルートディレクトリが見つかるまでプロセスを上方に繰り返し、その時点でフルパスを持ちます。シンボリックリンクを通過することはありません。だから、持っていることの目標 getcwd()
シンボリックリンクを介して続くパスを計算することは、システムコールとして実装されているかライブラリ関数として実装されているかにかかわらず、不可能です。
最善の解決策は、ビルドシステムがスペースを含むパス名を確実に処理することです。これは、シェルを通過したパス名を引用することを意味します。Cプログラムは名前のスペースを気にしません;問題に遭遇するのは、シェルのようなプログラムが文字列を解釈するときだけです。(プリプロセッサを実行するシェルスクリプトとして実装されたコンパイラは、多くの場合、スペースを含むパス名に問題があります。)