ファイル記述子の重複動作

ファイル記述子の重複動作

私はこのファイルを持っています:

1
2
3
4

私がpasteこちらに走るとき

paste - - <file

この結果

1       2
3       4

これまでは標準入力(からリダイレクトされますfile)が2回渡されるため、奇数paste行と偶数行がペアで印刷されます。

ただし、これが次のように変更された場合

paste - /dev/fd/0 <file

出力は

1       1
2       2
3       3
4       4

pastefileパラメータ-について一度、/dev/fd/0

私はこれを説明できません - 私が翻訳していたならこれ正しく、-両方とも/dev/fd/0単一のカーネルファイルテーブルエントリを参照する必要があるため、paste前のケースと同じ結果を生成する必要があります。

ベストアンサー1

これはLinux固有です。ほとんどのUnicesで開く(ファイル記述子をインポートするのと/dev/fd/nほぼ同じです)dup(n)ファイル説明を開くfdと同じn)Linuxでは、/dev/fd/nファイル記述子で開かれたファイルへのシンボリックリンクですn

したがって、Linuxでは次のようになります。

paste - /dev/fd/0 < file

同じです:

paste - file < file

(またはpaste file file)。

2 つの fd (0 と-open or で得られる独自のファイル) は独立しており、ファイルには独自のカーソルがあります。/dev/fd/0file

また、Linuxでは、ソケットで/dev/fd/nを使用できないことがわかります。

通常、Linuxではパイプでのみ使用しようとしています/dev/fd/n。しかし、この場合

cat file | paste - /dev/fd/0

(またはLinuxベースではなくオペレーティングシステムに切り替えること)は実際には役に立ちません。どちらの場合も標準入力として知られているpaste - -ため動作します。pasteしかし、ここではないので(fd 0からパイプまで)から(1行ではなく)ブロック全体を読み、次に-/ dev / fd / 0から別のブロックを(Linuxの別のfdから同じパイプに読み込みます。fd同じものを指すかどうか)ファイル説明を開くまたはパイプラインには重要ではありません。)両方ともread()ファイルの他の部分を読みますが、一度に数行ずつ読みます。

1行を読み取る前に、1行以上読み取らないようにpaste一度に1バイトずつ読み込むように指示する必要があります。これはおそらく再コンパイルしなければ不可能です。標準入力を一度に1バイトずつ読み取ることができますが、おそらくそうではありません。-/dev/fd/0pastestdbuf/dev/fd/0

$ cat file | paste - /dev/fd/0
1
2
3
4
$ cat file | stdbuf -i1 paste - /dev/fd/0
1       2
        3
        4

おすすめ記事