ファイルがシンボリックリンク(シンボリックリンク)であることを示すファイルモードはどれですか?
私の使用例はシンボリックを検出することですgitリポジトリ(およびその履歴)内のリンク。シンボリックリンクはファイルモードのためにシンボリックリンクであり、そのファイルモードはツールchmod
が設定するものであるという印象を受けました。
コメント
回答
ファイルモードには、ファイルの種類とファイルのアクセス許可という2つの異なる概念があります。ファイルのモードは、stat(2)
呼び出しの結果のst_mode
の値とls -l
はそれらをすべてまとめて表示します。詳細については UNIXの権限とファイルタイプについてを参照してください。
ファイルが作成されると、そのタイプは次のようになります。 「変更しないでください。さらに、Linuxシステムでは、「シンボリックリンク」の権限を指定することはできません。重要なのはターゲットの許可です(そして、それがシンボリックリンクの動作も決定するので、事実上フルモードです)。詳細については、ファイルパーミッションをシンボリックリンクに適用する方法を参照してください。 Mac OS Xでは、シンボリックリンクに独自の権限を設定できます。
最後に、git
は、認識されるモードの数が限られている単純化されたモデルを使用します。
-
040000
ディレクトリの場合 -
100644
通常のファイルの場合 -
100755
実行可能ファイルの場合 -
120000
シンボリックリンクの場合
これらの値は、git cat-file -p "master^{tree}"
などのコマンドを使用して確認できます。詳細については、 Pro Git を参照してください。
回答
ファイルがシンボリックリンク(シンボリックリンク)であることを示すファイルモードはどれですか?
確認するPOSIXAPIファイルがシンボリックリンクの場合、S_ISLNK
マクロを使用しています。
glibcでは、S_ISLNK
は次のように定義されています。
#define __S_IFMT 0170000 /* These bits determine file type. */ #define __S_IFLNK 0120000 /* Symbolic link. */ #define __S_ISTYPE(mode, mask) (((mode) & __S_IFMT) == (mask)) #define S_ISLNK(mode) __S_ISTYPE((mode), __S_IFLNK)
ieファイルはシンボリックリンクif ((mode & 0170000) == 0120000)
です(少なくともGNU / Linuxでは)。
回答
シンボリックリンク(一部のファイルシステムではシンボリックリンクの処理が異なります)は、別のファイル(またはディレクトリ)と同じ場所を指すinode
テーブルエントリです。
たとえば、foo
がinode 1234
の場合、bar
(a fooへのシンボリックリンク)はinode 1234
です。
bar
は実際には存在しません。 「実際の」ファイル。
Symlinks
は通常、ポイントするファイルのアクセス許可以外のアクセス許可を持っていません。したがって、bar"s
のアクセス許可は「同じ」as foo"s
。foo
(シンボリックリンク)に権限を設定することはできません。
(実際のファイル)。
そうは言っても、「非常に高レベルのビューです。ファイルシステムが異なればシンボリックリンクの処理も異なります。ツールが異なればsymlinks
の処理も異なります。一部のファイルシステムは「フラグ」symlinks
そしてそれらを特別に処理しますが、そうでないものもあります。
たとえば、Linux
のchmod
は、symlinks
権限がありますが、OSX
で取得できます。どちらの場合も、実際のファイルの権限が変更されます。
システムについて考えることはできません(そうではありません)。 symlink
が実際のファイルとは別の権限を持っている場合。
コメント
- いいえ、シンボリックリンクはファイルの一種です("すべてがファイル")で、一般的なファイルではなくファイル名が含まれています-目的データ。通常、このファイル名は既存のファイルを参照します— 'は、シンボリックリンクを持つことの要点ですが、これが正しいとは限りません。はい、シンボリックリンク(他のすべてのファイルと同様)ファイルのタイプ)にはinodeがあります。いいえ、symlinkとそれが指すファイルは、異なるinode番号を持つ別々のinodeを持っています。 ハード リンクは同じinodeを持っているため、同じinodenum ber。
- 高レベルであることが意図されていましたが、最近のシステムでは'ハードドライブにファイルを作成しません。iノードテーブルには文字列が含まれ、実際のファイルはありません。作成した。 'は"高速シンボリックリンク"
- と呼ばれていると思います' foo 'および' bar 'は両方ともノード1234へのポインタであり、'はシンボリックリンクではなくハードリンクです。 " bar "がSYMlinkの場合、文字列は文字列"になります。ノードの代わりにfoo "(またはfooへのパス)。実際、'意味のある場所をまったく指さないシンボリックリンクを作成できます。
ln -s 'this is not a real file' bar
- また、BSD(Mac OS Xを含む)には、シンボリックリンク自体のアクセス許可を設定できるlchmod()システムコールがあります。それが何に使われているのかわかりません。
chmod
パーミッションビット(rwxおよびsticky / setuid / setgidビットなど)を設定します:これは、"モード。しかし、代わりにファイルのタイプを参照しているようです。