0

Linux のディスク使用ユーティリティに似たプログラムを書いていますが、ハード リンクに関して問題があります。

現在、プログラムを実行しており、プログラムにハード リンクがあるかどうかを判断します。これを判断するには、ファイルで stat() を使用します。

if (st.st_nlink > 1)

これを実行すると、リンクとリンクされているプログラムの両方が返されますが、ディスク使用ユーティリティはプログラムのみを報告し、ハードリンクは報告しません。

C を使用して Linux でプログラムとそのハード リンクを区別するにはどうすればよいですか?

4

1 に答える 1

2

まず、複数のハード リンクを使用してプログラムファイルとデータファイルを異なる方法で処理するのはなぜですか?

次に、重要なのは名前や番号ではなく (ハード リンクがファイルに別の名前を追加することに注意してください)、inodeです。複数のハード リンクを持つ「ファイル」(つまり i ノード) の場合、同じ i ノードを指すすべての名前は同じ権利を持ちます (「メイン」名はなく、同じ i ノードを指すすべての名前は同等です)。

したがって、stat(2)st_devシステムコールを呼び出した後、とフィールドの両方を使用する必要がありst_inoます。これらは一緒になって、ファイル、つまりその i ノードを一意に識別します。

したがって、ファイルのst.st_nlink>1場合、おそらく ( st_dev, st_ino) ペアをハッシュテーブルまたはセット コンテナーに追加します。

C++ ではおそらく一部でも使用できますがstd::set<std::pair<dev_t,ino_t> >、C ではそのようなコンテナーを作成する必要があります。

注意: ファイル (たとえば、一部の inode) は名前がゼロの場合もあります (たとえば、 のunlink(2)後にシステムコールが呼び出された場合open(2))。これが一時ファイルの作成方法です。

于 2013-04-18T05:38:26.883 に答える