ファイルがシンボリックリンク(シンボリックリンク)であることを示すファイルモードはどれですか?


私の使用例はシンボリックを検出することですgitリポジトリ(およびその履歴)内のリンク。シンボリックリンクはファイルモードのためにシンボリックリンクであり、そのファイルモードはツールchmodが設定するものであるという印象を受けました。

コメント

  • superuser.com/questions/303040/ … を参照
  • ' git 'のシンボリックリンクとはどのファイルモードかを尋ねた方がよいようです。
  • stackoverflow.com/questions/15465436/git-how-to-handle-symlinks
  • chmodパーミッションビット(rwxおよびsticky / setuid / setgidビットなど)を設定します:これは、"モード。しかし、代わりにファイルのタイプを参照しているようです。
  • @JohnWHSmithファイルモードとファイルタイプの違いを区別するドキュメントへのリンクに賛成したいと思います。 :D

回答

ファイルモードには、ファイルの種類とファイルのアクセス許可という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テーブルエントリです。

たとえば、fooinode 1234の場合、bar(a fooへのシンボリックリンク)はinode 1234です。

barは実際には存在しません。 「実際の」ファイル。

Symlinksは通常、ポイントするファイルのアクセス許可以外のアクセス許可を持っていません。したがって、bar"sのアクセス許可は「同じ」as foo"sfoo

(シンボリックリンク)に権限を設定することはできません。

(実際のファイル)。

そうは言っても、「非常に高レベルのビューです。ファイルシステムが異なればシンボリックリンクの処理も異なります。ツールが異なればsymlinksの処理も異なります。一部のファイルシステムは「フラグ」symlinksそしてそれらを特別に処理しますが、そうでないものもあります。

たとえば、Linuxchmodは、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()システムコールがあります。それが何に使われているのかわかりません。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です