Proc stdin 奇妙な動作

Proc stdin 奇妙な動作

ここに画像の説明を入力してください。

誰かがこれが起こる理由と、stdinに送信されたデータがstdinに入力されたデータと同じように動作するように変更する方法を説明できますか?

gifファイルが見えない人のために

デフォルトでは3つの端末設定があります。 1つはnetcatサーバーを実行することです。コマンドは次のとおりです。

nc -l 127.0.0.1 4000

ターミナル2はnetcatクライアントのみを実行し、そのコマンドは次のとおりです。

nc 127.0.0.1 4000

クライアントに入力すると、これはデフォルトでプログラムのstdinまたはファイル記述子0にデータを入力することを意味します。 Enter キーを押すと、データがサーバーに表示されます。これは予想される動作です。

キーボード以外のソースから標準入力にデータを入力する場合は、最後に改行文字、改行文字、およびキャリッジリターンを提供する限り、同じように機能すると予想できます。

次のコマンドでターミナル3を実行している場合はそうではありません。

echo "test\n" > /proc/$pid/fd/0

奇妙なことに、エコーのデータは端末2にも表示されますが、キーボード入力として処理されないため、端末2のクライアントから端末1のサーバーにメッセージが送信されません。

私の結論はナンセンスです。

答え1

リンクを見ると、/proc/$PID/fd/0端末を指しているのがわかります。

# ls -l /proc/11962/fd/0
lrwx------ 1 foo users 64 Aug 15 04:30 /proc/11962/fd/0 -> /dev/pts/15

出力すると、プロセスに入力が渡されずにnc端末に出力されます。出力が正しく印刷されます。

次のようになります。

   /proc/$PID/fd/$N   <-------> [            ]
                                [  terminal  ]
[  nc  ] <--------------------> [            ]

これではありません:

           /proc/$PID/fd/$N  
               |       |
[      ] <-----+       +------> [            ]
[  nc  ] <--------------------> [  terminal  ]

プロセスのファイル記述子0がファイルに開いている場合、書き込みはプロセスへの入力として表示されると/proc/$PID/fd/0予想しますか、それともオープンファイルに移動しますか?

lrwx------ 1 foo users 64 Aug 15 04:36 /proc/11994/fd/0 -> /tmp/testfile

echo foo > /proc/11994/fd/0このような状況ではどうすればよいですか?

ここも同様です。プロセスが fd からデータを読み取ると、ファイルからデータを読み込みます。ただし、書き込み用に同じファイルを再度開くと、次のように/proc/$PID/fd/$N書き込みます。到着文書。

端末の入力バッファにデータを入力するには、TIOCSTI ioctlまたは同様のメカニズムを使用する必要があります。バラよりtty_ioctl(4)

関連情報