回答編集履歴
3
1はstdoutだよ
answer
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
| 番号 | デバイス | モード |
|
8
8
|
|:---:|:---:|:---:|
|
9
9
|
|0| stdin | r |
|
10
|
-
|1|
|
10
|
+
|1| stdout | w |
|
11
11
|
|2| stderr | w |
|
12
12
|
|3| (無し) | - |
|
13
13
|
|
@@ -18,7 +18,7 @@
|
|
18
18
|
| 番号 | デバイス | モード |
|
19
19
|
|:---:|:---:|:---:|
|
20
20
|
|0| stdin | r |
|
21
|
-
|1|
|
21
|
+
|1| stdout | w |
|
22
22
|
|2| stderr | w |
|
23
23
|
|3| /dev/tcp/相手先ホスト名/ポート番号 | rw |
|
24
24
|
|
2
標準入力について勘違いしていたのを修正
answer
CHANGED
@@ -2,23 +2,25 @@
|
|
2
2
|
|
3
3
|
`3`は**ファイルディスクリプタ**の番号です。UNIX/Linuxではあらゆるプログラムにおいてファイル(標準入出力やネットワーク通信含む)の読み書きをするときはファイルディスクリプタというただの番号でやり取りしています。`2>&1`とかの`2`や`1`も同じくファイルディスクリプタの番号です。
|
4
4
|
|
5
|
-
ファイルには読み(
|
5
|
+
ファイルには読み(r)と書き(w)があるため、各ファイルディスクリプタの番号に対してrかwかrwが設定されて、何かしらのデバイス(ファイル)に割り当てることができます。bashでは通常起動した直後は次のようになっています。
|
6
6
|
|
7
|
-
| 番号 |
|
7
|
+
| 番号 | デバイス | モード |
|
8
8
|
|:---:|:---:|:---:|
|
9
|
+
|0| stdin | r |
|
9
|
-
|1| stdin |
|
10
|
+
|1| stdin | w |
|
10
|
-
|2|
|
11
|
+
|2| stderr | w |
|
11
|
-
|3| (無し) |
|
12
|
+
|3| (無し) | - |
|
12
13
|
|
13
|
-
最初は`1`と`2`だけで、`3`以降は割り当てがありません。なお、`3`だけでなくそれよりも大きい数字が使えます(どこまで使えるかはulimitの制限等による)。そこで、`exec 3<> /dev/tcp/相手先ホスト名/ポート番号`としたときにどうなるかです。
|
14
|
+
最初は`0`と`1`と`2`だけで、`3`以降は割り当てがありません。なお、`3`だけでなくそれよりも大きい数字が使えます(どこまで使えるかはulimitの制限等による)。そこで、`exec 3<> /dev/tcp/相手先ホスト名/ポート番号`としたときにどうなるかです。
|
14
15
|
|
15
16
|
`exec`は「指定された新しいコマンドを実行して今のプロセスと置き換える」というコマンドです。Cのsystemと同じです。ただ、今回、`exec`にはコマンドにあたる部分はありません。この場合は、`3<> /dev/tcp/相手先ホスト名/ポート番号`のファイルのリダイレクト処理だけして、置き換わるという動作をします。そう、この`3<>...`の部分はファイルのリダイレクトです。`> hoge.txt`や`< hoge.txt`と書くのと同じで、`3`にtcpの接続先を割り当てるという意味になります。よって、このあとは、先ほどの表が下記のように変わります。
|
16
17
|
|
17
|
-
| 番号 |
|
18
|
+
| 番号 | デバイス | モード |
|
18
19
|
|:---:|:---:|:---:|
|
20
|
+
|0| stdin | r |
|
19
|
-
|1| stdin |
|
21
|
+
|1| stdin | w |
|
20
|
-
|2|
|
22
|
+
|2| stderr | w |
|
21
|
-
|3| /dev/tcp/相手先ホスト名/ポート番号 |
|
23
|
+
|3| /dev/tcp/相手先ホスト名/ポート番号 | rw |
|
22
24
|
|
23
25
|
こうしてTCP通信を普通のファイルや標準入出力のように扱えるようになったと言うことです。
|
24
26
|
|
1
誤字の修正
answer
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
たぶん、一番重要なのは、`3`が何を意味するかです。それがわかると、見えてくると思います。
|
2
2
|
|
3
|
-
`3`は**ファイルディスクリプタ**の番号です。UNIX/Linuxではあらゆるプログラムにおいてファイル(標準入出力やネットワーク通信含む)の読み書きをするときはファイルディスクリプタというただの番号でやり取りして
|
3
|
+
`3`は**ファイルディスクリプタ**の番号です。UNIX/Linuxではあらゆるプログラムにおいてファイル(標準入出力やネットワーク通信含む)の読み書きをするときはファイルディスクリプタというただの番号でやり取りしています。`2>&1`とかの`2`や`1`も同じくファイルディスクリプタの番号です。
|
4
4
|
|
5
5
|
ファイルには読み(in)と書き(out)があるため、一つのファイルディスクリプタの番号に対してinとoutがそれぞれ割り当てることができます。bashでは通常起動した直後は次のようになっています。
|
6
6
|
|