ファイルとは何ですか?

ファイルとは何ですか?

Linux/Unixのファイル特性は何ですか?

ファイルは通常のファイル、ディレクトリ、シンボリックリンクデバイスファイルソケット管路先入選出、そして私が恋しい以上。たとえば、シンボリックリンクは次のようになります。

$ sudo file /proc/22277/fd/23
/proc/22277/fd/23: broken symbolic link to socket:[7540288]

ソケット:

$ sudo ls -l /run/user/1001/systemd/notify
srwxrwxr-x 1 testme testme 0 Feb  6 16:41 /run/user/1001/systemd/notify
  1. 以下の特徴を持つファイルですインデックスノード(メモリまたはセカンダリストレージデバイスの一部のファイルシステムのinode?)すべてのファイルタイプにinodeがありますか? (どちらの質問でもそうだと思います。)

  2. Linuxインターネットドメインソケット、トランスポートプロトコル(TCP / UDP)ソケットとポート開いたファイルの説明があるのがファイルだと言うようです。開かれたファイル記述のあるエントリには必ずinodeが必要ですか?

    開いたファイルの説明はファイルよりも優れているため、「ファイル」を定義することはできません。ネットワークソケットとUnixドメインソケットの両方が開かれたファイル記述です。 UDSはディスク上の何かに関連付けることができます(これに影響を与える可能性がある条件はたくさんあります)。 NSはディスクの何も接続しません。

ありがとうございます。

ベストアンサー1

長い話を短く

  • ファイルは、一部またはすべての基本操作(開く、読み取り、書き込み、閉じる)を実行できるオブジェクトであり、inodeにメタデータが格納されています。
  • ファイル記述子はこれらのオブジェクトへの参照です。
  • 開いたファイルの説明(たとえば、開いている部分が重要です)は次のとおりです。どのようにファイル(少なくとも1つのファイル記述子で表されます)が開いています。

抽象化としてのドキュメント

相談しようPOSIX 定義 2017, セクション 3.164Fileの定義方法は次のとおりです。

書き込み、読み取り、または両方を行うことができるオブジェクト。ファイルには、アクセス権とタイプを含む特定の属性があります。ファイルタイプには、汎用ファイル、文字特殊ファイル、ブロック特殊ファイル、FIFO特殊ファイル、シンボリックリンク、ソケット、およびディレクトリが含まれます。実装では、他の種類のファイルをサポートできます。

したがって、ファイルは私たちが読んだり書いたりすることができます。みんな家に帰ってください。イベントは終了しました!

まあ、そんなに速くないです。これらの定義は関連概念のための多くのスペースを開き、一般的なファイルとパイプラインの間に明らかな違いがあります。 「すべてがファイルである」はそれ自体が概念であるデザインパターン文字通りの声明ではなく。このパターンに基づいて、ディレクトリ、パイプ、デバイスファイル、メモリファイル、ソケットなどのファイルタイプはすべて一連のシステムコールを介して操作できます(たとえば、open()ソケットopenat()の場合、USBの場合は一貫した方法で)。さまざまなデバイスがありますが、すべてがまったく同じUSBポートに接続されています(実際にはAからCまで、さまざまな種類のUSBポートタイプがありますが、アイデアを得ることができます)。write()recv()send()

もちろん、これが機能するためには、一貫した方法で実際のデータへの一種のインタフェースまたは参照が必要です。ファイル記述子:

ファイルアクセス用に開いているファイルを識別するプロセスごとに一意の負以外の整数。新しく作成されたファイル記述子は、0から{OPEN_MAX}-1までの値を持ちます。

したがって、write()通常のファイルに書き込むのと同じ方法で、ファイル記述子1を介してSTDOUTにアクセスできます/home/user/foobar.txt。ファイルにアクセスすると、open()ファイル記述子を取得し、write()同じ機能を使用してファイルに書き込むことができます。これがUnixの最初の創始者に対処しようとしたことです。まさにミニマリズムと一貫した動作です。これにより、command > /home/user/foobar.txtシェルは参照されたファイル記述子をコピーしてfoobar.txt ファイル記述子1(echoのSTDOUT)に渡すか、commandより正確にはコマンドを実行してからdup2(3,1)コマンドexecve()を実行します。しかし、それにもかかわらず、command何も起こらなかったように、ファイル記述子1に同じ書き込みシステムコールが使用され続けます。

もちろん、ほとんどのユーザーがファイルだと思うほど、ディスクファイルシステムの一般的なファイルだと思います。これはさらに一致します。一般ファイル定義、セクション3.323:

システムが追加の構造を適用せずにランダムにアクセスできるバイトシーケンスであるファイル。

対照的に、私たちはソケット:

POSIX.1-2017のシステムインタフェースボリュームで説明されているように、プロセス間通信のための通信エンドポイントとして使用される特定の種類のファイル。

タイプに関係なく、さまざまなファイルタイプに対して実行できる操作は概念的に同じです(開く、読み取り、書き込み、閉じる)。


すべてのファイルにはinodeがあります。

ファイル定義で注目すべき点は、ファイルにinodeに格納される「特定の属性」があることです。実際、特にLinuxでは、以下を参照できます。inode(7) マニュアル最初の行:

各ファイルには、ファイルのメタデータを含むinodeがあります。アプリケーションはstat(2)(または関連する呼び出し)を使用してこのメ​​タデータを取得できます。

繁栄。明確で直接的です。私たちにとって最もよく知られているinodeは、ディスク上のデータブロックとディレクトリに格納されているファイル名の間のブリッジです(ディレクトリはファイル名とそのinodeのリストにすぎないからです)。でも仮想ファイルシステムたとえば、カーネルの Pipefs と sockfs では inode を見つけることができます。次のコードスニペットを例に挙げます。

static char *pipefs_dname(struct dentry *dent, char *buffer, int buflen)
{
    return dynamic_dname(dentry, buffer, buflen, "pipe:[%lu]",
            dentry->d_inode->i_ino);
}

ファイルを開く手順

これは完全に混乱しているので、Linux / Unixは「オープンファイルの説明」という機能を導入しました。スティーブン・チャジェラスの言葉によると、

ファイル自体ではなく、ファイルがどのように開かれたかについての履歴に近い。

そしてそれにPOSIXの定義:

プロセスまたはプロセスグループがファイルにアクセスした方法の履歴。各ファイル記述子は1つのオープンファイル記述を正確に参照しますが、オープンファイル記述は複数のファイル記述子で参照できます。ファイルオフセット、ファイル状態、およびファイルアクセスモードは、オープンファイル記述の属性です。

今私たちも見るとLinuxカーネルについて学ぶ本で著者はこう指摘する。

Linux は次の BSD ソケットを実装します。ソックスファイルシステム特別なファイルシステム...もっと正確に言えば、新しいBSDソケットごとに、カーネルは次のことを行います。ソックスファイルシステム特殊ファイルシステム

これを覚えてソケットはファイル記述子でも参照されます。したがって、カーネルのソケットに関連するオープンファイル記述があり、ソケットがファイルであると結論付けることができます。

続きます。 。 。おそらく

おすすめ記事