議論/標準入出力/ストリームによる実装/01.標準入出力とは何か


Top / 議論 / 標準入出力 / ストリームによる実装 / 01.標準入出力とは何か

このページは何か? (by ひげぽん)

標準入出力とは何か?を「どういった事を実現したいか?」という切口で考えます。

アクション

  1. ひげぽんが「標準入出力ってこんなことができるよね?」って事を列挙します
  2. ツッコミがあれば追加・修正
  3. 次に進む

標準入出力ってこんなことができるよね?

以下 stdout/stdin と略記します。

バケツリレーについて (by ひげぽん)

Mona上で理想的にはどういう動きになるかをまとめて自分の理解を確認します。

シナリオ

A->B->C->シェル

  1. A:write STDOUT "Hage";
  2. B:受け取った文字列を write STDOUT "Hage";
  3. C:"Hage"の'H'を'h'にして write STDOUT "hage"
    というシナリオの裏で何が起きているか。

詳細

A

B

C

シェル

Mona上で実現するには

上記の事から

プロセスサーバで保持しているプロセス毎の情報にSTDOUT/STDIN情報を持たせれば良いのではないか。
以下疑似コード

struct ProcessInfo {
    略
    dword stdoutHandle;
    dword stdinHandle;
}

(例)Bが write STDOUTを発行

  1. シェルがBを起動時にプロセスサーバにBのstdoutHandle/stdinHandleを知らせる
  2. Bが write STDOUTを発行
    1. プロセスサーバに stdoutHandleを問い合わせる
    2. stdoutHandleからStreamを特定
    3. Streamに対して write

writeのたびにプロセスサーバに問い合わせる必要があるかは一考の余地がある

コメント

最新の1000件を表示しています。 コメントページを参照

お名前:
  • 【訂正】バケツリレーの説明が少しおかしいことに気付きました。詳しいことは⇒議論/標準入出力/ストリームによる実装/01.標準入出力とは何か/ストリームの共有 -- Tino 2006-10-09 (月) 11:25:45
  • 【確認】横からすみません。下の議論は、(lsの代わりにpsですが)次の3つの違いを認識なさった上での議論と考えてよいですか。
    $uname
    SunOS
    $perl -e 'system("ps -l")'
    F S    UID   PID  PPID   C PRI NI     ADDR     SZ    WCHAN TTY         TIME CMD
    0 R    100  2524  2493   0  45 20        ?    778          pts/2       0:00 perl
    0 O    100  2525  2524   0  40 20        ?    359          pts/2       0:00 ps
    0 S    100  2493  2490   0  40 20        ?    674        ? pts/2       0:00 bash
    $perl -e 'system("ps -l;")'
    F S    UID   PID  PPID   C PRI NI     ADDR     SZ    WCHAN TTY         TIME CMD
    0 S    100  2526  2493   0  50 20        ?    778        ? pts/2       0:00 perl
    0 S    100  2527  2526   0  50 20        ?    308        ? pts/2       0:00 sh
    0 S    100  2493  2490   0  50 20        ?    674        ? pts/2       0:00 bash
    0 O    100  2528  2527   0  50 20        ?    359          pts/2       0:00 ps
    $perl -e 'system("ps -l|cat")'
    F S    UID   PID  PPID   C PRI NI     ADDR     SZ    WCHAN TTY         TIME CMD
    0 R    100  2533  2493   0  60 20        ?    778          pts/2       0:00 perl
    0 O    100  2536  2535   0  50 20        ?    359          pts/2       0:00 ps
    0 R    100  2534  2533   0  60 20        ?    308          pts/2       0:00 sh
    0 S    100  2493  2490   0  50 20        ?    674        ? pts/2       0:00 bash
    0 R    100  2535  2534   0  60 20        ?    308          pts/2       0:00 sh
    shの数に注意。--EDS12752006-10-08 (日) 20:18:27
    • 考えていませんでした。1. system()がシェルの機能を使うときにシェルを呼び出す 2. シェルはパイプラインでforkする ということですね。 -- Tino 2006-10-08 (日) 21:58:42
      • シェルとは、ジョブ管理兼入出力繋ぎ変え装置で、その入出力のデフォルトが標準入出力というのが私の解釈です。kernelを意識せずUNIXをお客さんとして使っていて、それに慣れきっている者としては、シェルの仲介不要論は衝撃的でした。monaはUNIXじゃないんでそういう考えも有りというコトも改めて考えると面白いです。 -- EDS1275 2006-10-08 (日) 22:33:18
      • なるほど。良く分かりました。 -- Tino 2006-10-08 (日) 22:59:46
  • 【提案】ようやく誤解はなくなったようですね。今回は誤解を排除するため、念入りに確認しました。今後は誤解がないかどうかと、誤解したときには原因を、念入りに確認しようかと思います。そのため冗長になるかもしれませんが、よろしいですか? -- Tino 2006-10-08 (日) 15:29:16
    • ありがとうございます。構いません。 -- ひげぽん 2006-10-08 (日) 15:32:05
    • 【質問】今回のやり方は、ひげぽんさんが議論/ストリーム/反省材料でコメントされている「以下の事に留意するとうまくいくのではないかと思っていますので実践します。」を参考にしました。何か食い違いはありますか? -- Tino 2006-10-08 (日) 15:36:04
  • ひげぽんさんのバケツリレーの実装イメージについて感想を書きます。 -- Tino 2006-10-07 (土) 17:32:59
    • 「↑の設定をするのはシェル」⇒プロセスの二者間で調整できることではないか? -- Tino 2006-10-07 (土) 17:35:33
      • できますが、「プロセス同士がお互いを知らなければいけない点がデメリットである」と考えています。 -- ひげぽん 2006-10-07 (土) 17:53:40
      • 知らない同士をくっつけるケースなんてありますか? -- Tino 2006-10-07 (土) 18:02:03
      • 知らない同士のケース「find -name "*.cpp" |xargs grep 'void hoge()'を想定しています。 -- ひげぽん 2006-10-07 (土) 18:04:51
      • シェルの特権ではなく、プロセスの二者間の関係に一般化できます。具体的には、シェルがfindとxargsの親でxargsがgrepの親で、それぞれ親子間でだけ知っていれば、findとgrepがお互い知らなくてもバケツリレーが成立します。 -- Tino 2006-10-07 (土) 18:12:33
      • 結局同じ事を考えているようですね。Tinoさんは二者間同士というのを上記のように親子関係も絡めて考えていて、僕はfindとxargsは知らない同士であり、シェルがそこを繋げると考えています。一般化できるという点にも同意です。 -- ひげぽん 2006-10-08 (日) 14:00:05
      • 【確認】この場合、シェルがたまたま親なので、「シェルがそこを繋げる」ということになり、「同じ事」になります。それは「find -name "*.cpp" |xargs grep 'void hoge()'を想定しています。」と言われたときに分かっていました。ここまで良いですか? -- Tino 2006-10-08 (日) 14:30:18
      • はい。 -- ひげぽん 2006-10-08 (日) 14:36:26
      • 【確認】私は「A->B->C->シェル」を見たとき、私が議論/標準入出力/ストリームによる実装/01.標準入出力とは何か/バケツリレーで引き合いに出した「ls→Perl→シェル→kterm」を連想して、「ls→Perl」間はシェルと関係ないと思って、シェルの権限ではないと感じました。ここまで良いですか? -- Tino 2006-10-08 (日) 14:40:10
      • はい。 -- ひげぽん 2006-10-08 (日) 14:43:58
      • 【質問】ひげぽんさんの構想では、「ls→Perl」間のようなケースはどう処理するのですか? -- Tino 2006-10-08 (日) 14:48:15
      • 02.設計にも書いていますが、プロセスを起動時にstdin/stdoutを指定できるようにして対応します。 -- ひげぽん 2006-10-08 (日) 14:51:40
      • 【確認】「A->B->C->シェル」とだけ書かれた段階で「find -name "*.cpp" |xargs grep 'void hoge()'」を想定していることは分からないので、A→B間をシェルが仲介するというのが理解できなかった。そのため「シェルが管理している=特権がある」と解釈した。これは誤解ですか? -- Tino 2006-10-08 (日) 14:56:15
      • はい。 -- ひげぽん 2006-10-08 (日) 15:03:38
      • 【確認】「find -name "*.cpp" |xargs grep 'void hoge()'」も「02.設計にも書いていますが」も後出しジャンケンなので、それを提示される前の段階で意図を読み取るのは困難です。これは私の理解力の欠如ですか? -- Tino 2006-10-08 (日) 15:09:53
      • いいえ。 -- ひげぽん 2006-10-08 (日) 15:22:08
    • 「このときシェルの STDOUT = 画面への出力」⇒画面出力を抽象化しないと日本語コンソールやGUIコンソールがきれいに実装できない。画面出力専用のプロセスがあって、それを日本語コンソールやGUIコンソールと交換できるようにするイメージ。 -- Tino 2006-10-07 (土) 17:39:42
      • 同意です。考えます。 -- ひげぽん 2006-10-07 (土) 17:54:11
    • 「シェルがBを起動時にプロセスサーバにBのstdoutHandle/stdinHandleを知らせる」⇒Bが自発的に報告すれば良いので、シェルの仲介は不要では? -- Tino 2006-10-07 (土) 17:44:39
    • 【感想】今はシェルがサーバーということになっているが、標準入出力を汎用化すれば、普通のプロセスにできる。 -- Tino 2006-10-07 (土) 17:47:52
  • バケツリレーの詳細のレイアウトが崩れて読みにくかったので、見出しのインデントレベルをいじりました。 -- Tino 2006-10-07 (土) 17:29:01
    • ありがとうございます。 -- ひげぽん 2006-10-07 (土) 17:54:35
  • バケツリレーについて書きました。→議論/標準入出力/ストリームによる実装/01.標準入出力とは何か/バケツリレー -- Tino 2006-10-07 (土) 11:57:55
    • ありがとうございます。理解をまとめてみました。 -- ひげぽん 2006-10-07 (土) 16:48:13

MENU

now: 1

リンク


最新の20件
2018-05-03 2017-09-29 2017-04-25 2017-01-10 2016-12-11 2016-10-04 2016-08-14 2016-06-05 2016-05-29 2016-04-15 2015-12-28 2013-02-25 2013-02-21 2013-02-20 2013-02-12 2013-02-11 2013-02-10
最新の20件
2010-02-01 2010-01-31 2010-01-30 2010-01-29 2010-01-16

Counter: 3221, today: 2, yesterday: 1

リロード   新規 編集 凍結 差分 添付 複製 改名   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS

Last-modified: 2008-03-28 (金) 15:48:03 (3769d);  Modified by mona
PukiWiki 1.4.6 Copyright © 2001-2005 PukiWiki Developers Team. License is GPL.
Based on "PukiWiki" 1.3 by yu-ji
Powered by PHP 5.2.17
HTML convert time to 0.067 sec.