2009-07-23 1 views
5

realpath()関数でファイルの絶対パスを取得することは可能です。しかし、バグのセクションによると、その実装にはいくつかの問題があります。詳細は以下の通りです:linuxの下でrealpath()を使ってファイルの絶対パスをプログラムで取得する方法は?


BUGS

を、この機能を使用することは避けてください。非標準のresolved_pa​​th == NULL機能を使用しない限り、出力バッファresolved_pa​​thに適したサイズを決定することは不可能であるため、これは設計上の理由で壊れています。 POSIXによれば、サイズPATH_MAXのバッファで十分ですが、PATH_MAXは定義された定数である必要はなく、pathconf(3)を使用して取得する必要があります。そして、pathconf(3)の結果は実際には助けになりません。なぜなら、POSIXは、pathconf(3)の結果が膨大で、メモリの割り当てには適していないと警告しているからです。一方、pathconf(3)は、PATH_MAXが束縛されていないことを示すために-1を返すことがあります。

libc4とlibc5の実装には、バッファオーバーフローが含まれています(libc-5.4.13で修正されています)。したがって、mount(8)のようなset-user-IDプログラムにはプライベートバージョンが必要です。


したがって、ファイルの絶対パスを取得するのがベストプラクティスですか?

+0

「[OS Xコマンドラインアプリケーションの絶対パスをプログラム的に取得する]」の複製(http://stackoverflow.com/questions/799679/programatically-retrieving-the-absolute-path-of-an-os- x-command-line-app) "? – bortzmeyer

+0

いいえ、同じものではありません。実行可能ファイルのパスではなく、通常のファイルの絶対パスを取得する方法を知りたい。 – jcadam

答えて

2

シェルからは、readlink -f $FILEを使用して完全なパスを取得できます。 glibcにはreadlink()という機能があります。多分それがあなたを助けます。

+0

私はcoreutilsパッケージ内のreadlinkコマンドのソースコードを読んでいます。単純な解決策があります。PATH_MAXを1024に定義するだけです。 -__- !!! – jcadam

3
# man 2 readlink 

使用GETCWD()とのrealpathを再実装するバッファサイズを与えることを可能にするREADLINK()()。シンボリックリンクを解決する必要があることに注意してください。 "そして ".."を左から右に正しく実行してください。

5

この質問は古いですが、コアの問題に対処する回答はありません。少なくとも2つの理由から、参照されているマニュアルページOPが間違っています。

NULL引数オプションのPOSIX 2008の追加/強制サポートの1つで、realpathが文字列を割り当てます。この機能を使用しているプログラムは、GNU/Linuxのすべての関連バージョン、おそらく他のほとんどの最新のシステム、POSIX 2008に準拠したものに移植可能です。

2番目の理由は、PATH_MAXに対する警告です。これは純粋に「恣意的な限界」に対するGNUの宗教的イデオロギーです。現実の世界では、パス名の長さ制限を持たないため、あらゆる種類の不正行為/ DoSが追加され、失敗することのないタスクに多くの失敗事例が追加され、realpath以上のインターフェイスが破損します。

最大限の移植性を気にしている場合は、おそらく両方の方法を組み合わせて使用​​することをお勧めします。詳細はPOSIXのドキュメントを参照してください:

http://pubs.opengroup.org/onlinepubs/9699919799/functions/realpath.html

IはPATH_MAXが定義されている場合、固定サイズ、発信者が提供する緩衝液を使用し、そうでなければNULLを通過します。これはすべてのケースをカバーしているようですが、古いバージョンのPOSIXをチェックして、PATH_MAXが定義されていない場合の対処方法を知りたいかもしれません。