1

私の仕事は、C で inode を使用して Unix コマンドを実装するpwdことです。「..」の inode が「.」の inode と同じになるまで、再帰的に戻る方法を見つけました。私が今抱えている問題は、「..」のディレクトリ名を取得する方法がわからないことです。stat 構造体を使用すると、サイズ、inode などのファイルに関するすべてを取得できますが、次のような出力を作成できるようにファイルを取得する必要があります。

/home/GONZAGA/tcosentino/documents/OS

これらのディレクトリ名を取得するにはどうすればよいですか?

私は stat 構造体を持っているので、これまでのところこれを出力できます:

[tcosentino@ada2 OS]$ ./a.out .
filename: .
 device: 64768
 inode: 55804237
 protection: 40755
 number of hard links: 5
 user ID of owner: 81963576
 group ID of owner: 501
 device type (if inode device): 0
 total size, in bytes: 4096
 blocksize for filesystem I/O: 4096
 number of blocks allocated: 8
 time of last access: 1354817261 : Thu Dec  6 10:07:41 2012
 time of last modification: 1354817249 : Thu Dec  6 10:07:29 2012
 time of last change: 1354817249 : Thu Dec  6 10:07:29 2012
4

1 に答える 1

0

現在のディレクトリの名前を見つけるための単純で半力ずくのアプローチは、親ディレクトリの名前を見つけなければならないことを意味し、次に親ディレクトリにリストされている名前をスキャンして、同じ inode 番号を持つものを見つけ、現在のディレクトリとしてのデバイス番号。親ディレクトリの名前を見つけるにはどうすればよいですか? さて、... ディレクトリ ツリーを再帰的に上っていき、システムのルートに到達したところで停止します。ここで、 の inode 番号とデバイス番号は..の場合と同じです.

これは単純なアプローチであることに注意してください。現在のディレクトリが NFS マウントされていて、自動マウントされるホーム ディレクトリが多数ある場合、壊滅的にパフォーマンスが低下する可能性があります。したがって、自動マウントなどをトリガーせずにそれを行う別の方法が必要ですが、それが何であるかは調査していません。

1987 年のバージョン 1.1、2008 年のバージョン 2.5 という壊滅的なパフォーマンスを持つコードがあります (そして、それは Mac OS X 10.10.1 でコンパイルされ、失敗したと思っていましたが、よく調べてみると正しく実行されていましたが、印刷された出力を誤解していました; バージョン 2.6 では印刷がより明確になるため、再び混乱することはありません)。

于 2014-12-28T22:59:21.663 に答える