質問するログイン新規登録

回答編集履歴

3

1はstdoutだよ

2016/06/01 09:32

投稿

raccy
raccy

スコア21784

answer CHANGED
@@ -7,7 +7,7 @@
7
7
  | 番号 | デバイス | モード |
8
8
  |:---:|:---:|:---:|
9
9
  |0| stdin | r |
10
- |1| stdin | w |
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| stdin | w |
21
+ |1| stdout | w |
22
22
  |2| stderr | w |
23
23
  |3| /dev/tcp/相手先ホスト名/ポート番号 | rw |
24
24
 

2

標準入力について勘違いしていたのを修正

2016/06/01 09:32

投稿

raccy
raccy

スコア21784

answer CHANGED
@@ -2,23 +2,25 @@
2
2
 
3
3
  `3`は**ファイルディスクリプタ**の番号です。UNIX/Linuxではあらゆるプログラムにおいてファイル(標準入出力やネットワーク通信含む)の読み書きをするときはファイルディスクリプタというただの番号でやり取りしています。`2>&1`とかの`2`や`1`も同じくファイルディスクリプタの番号です。
4
4
 
5
- ファイルには読み(in)と書き(out)があるため、一つのファイルディスクリプタの番号に対してinとoutぞれ割り当てることができます。bashでは通常起動した直後は次のようになっています。
5
+ ファイルには読み(r)と書き(w)があるため、ファイルディスクリプタの番号に対してrかwかrw設定さて、何かしらのデバイス(ファイル)に割り当てることができます。bashでは通常起動した直後は次のようになっています。
6
6
 
7
- | 番号 | in | out |
7
+ | 番号 | デバイス | モード |
8
8
  |:---:|:---:|:---:|
9
+ |0| stdin | r |
9
- |1| stdin | stdout |
10
+ |1| stdin | w |
10
- |2| (無し) | stderr |
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
- | 番号 | in | out |
18
+ | 番号 | デバイス | モード |
18
19
  |:---:|:---:|:---:|
20
+ |0| stdin | r |
19
- |1| stdin | stdout |
21
+ |1| stdin | w |
20
- |2| (無し) | stderr |
22
+ |2| stderr | w |
21
- |3| /dev/tcp/相手先ホスト名/ポート番号 | /dev/tcp/相手先ホスト名/ポート番号|
23
+ |3| /dev/tcp/相手先ホスト名/ポート番号 | rw |
22
24
 
23
25
  こうしてTCP通信を普通のファイルや標準入出力のように扱えるようになったと言うことです。
24
26
 

1

誤字の修正

2016/06/01 09:30

投稿

raccy
raccy

スコア21784

answer CHANGED
@@ -1,6 +1,6 @@
1
1
  たぶん、一番重要なのは、`3`が何を意味するかです。それがわかると、見えてくると思います。
2
2
 
3
- `3`は**ファイルディスクリプタ**の番号です。UNIX/Linuxではあらゆるプログラムにおいてファイル(標準入出力やネットワーク通信含む)の読み書きをするときはファイルディスクリプタというただの番号でやり取りしています。`2>&1`とかの`2`や`1`も同じくファイルディスクリプタの番号です。
3
+ `3`は**ファイルディスクリプタ**の番号です。UNIX/Linuxではあらゆるプログラムにおいてファイル(標準入出力やネットワーク通信含む)の読み書きをするときはファイルディスクリプタというただの番号でやり取りしています。`2>&1`とかの`2`や`1`も同じくファイルディスクリプタの番号です。
4
4
 
5
5
  ファイルには読み(in)と書き(out)があるため、一つのファイルディスクリプタの番号に対してinとoutがそれぞれ割り当てることができます。bashでは通常起動した直後は次のようになっています。
6
6