誰かがこれが起こる理由と、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)