[an error occurred while processing this directive] [an error occurred while processing this directive]


プログラミング
逆引き
クライアントとの通信
VisMでの通信
Factoryでの通信
WebServiceでの通信
CSP (Cache' Server Pages)
Cache'SQL
設定・性能


【広告】









pipe経由の入出力

pipe I/O

 「Linuxシェルなどで使用されるパイプをCache'と組み合わせることができるのか」 という質問を頂きましたので調べてみました。

パイプとリダイレクション

パイプとは、あるプログラムの標準出力を他のプログラムの標準入力として使う仕組みです。
 次の例は、ps aux でプロセスの一覧を出力し、パイプを経由して grep apache に渡して、apache という文字列が含まれる行だけを出力しています。
# ps aux | grep apache

リダイレクションとは、標準入出力先を変更する仕組みです。
 次の例は、ls -al でファイルの一覧を出力し、結果を /tmp/ls.txt に出力しています。
# ls -al > /tmp/ls.txt

Unixのシェルなどでよく使われるパイプやリダイレクションですが、これをCache'と組み合わせることが出来れば便利そうです。

パイプからの入力

パイプからの入力は標準入力として渡されます。

Cache'でデバイスからの入出力を行うときに、どのデバイスに対して操作を行うかを指定するコマンドがOpenコマンド、Useコマンドです。
標準入力はデバイスID 0として定義されています。また、デフォルトで開かれていますので、Openする必要はありません。

標準入力から渡された内容を ^x グローバルに格納するプログラムを、以下のように作成してみました。
PipeIn ;パイプからの入力
  Do $ZUtil(68,40,1) //このプロセスで$ZEOF検出を有効にする
  For i=1:1 Quit:$ZEOF
    Use 0
    Read 
dat
    Set ^x(i)=dat
  }
  Do $ZUtil(68,40,0)

  Quit
このプログラムをTESTという名前でUSERネームスペースに保存します。

psコマンドの出力を、作成したプログラムで受け取るには以下のように記述します。
$ ps au | cache -U USER PipeIn^TEST
実行後、^x グローバルの内容を確認してみます。
USER>zw ^x
^x(1)="USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND"
^x(2)="root 3724 0.0 0.0 3792 484 tty1 Ss+ Aug20 0:00 /sbin/mingetty tty1"
^x(3)="root 3725 0.0 0.0 3792 480 tty2 Ss+ Aug20 0:00 /sbin/mingetty tty2"
^x(4)="root 3734 0.0 0.0 3792 480 tty3 Ss+ Aug20 0:00 /sbin/mingetty tty3"
^x(5)="root 3735 0.0 0.0 3792 484 tty4 Ss+ Aug20 0:00 /sbin/mingetty tty4"
^x(6)="root 3736 0.0 0.0 3792 480 tty5 Ss+ Aug20 0:00 /sbin/mingetty tty5"
^x(7)="root 3745 0.0 0.0 3792 484 tty6 Ss+ Aug20 0:00 /sbin/mingetty tty6"
^x(8)="root 3831 0.0 0.1 83232 5596 tty7 Ss+ Aug20 0:00 /usr/bin/Xorg :0 -br -audit 0 -auth /var/gdm/:0.Xauth -nolisten tcp vt7"
^x(9)="root 31206 0.0 0.0 66100 1608 pts/1 Ss 19:35 0:00 -bash"
^x(10)="root 31336 0.0 0.0 65628 972 pts/1 R+ 19:38 0:00 ps au"
^x(11)="root 31337 0.0 0.0 20820 3072 pts/1 S+ 19:38 0:00 /CacheSys/bin/cuxsession -s /CacheSys/mgr -U USER PipeIn^TEST"
^x(12)=""
このように、パイプからの入力を受け取る事ができました。

パイプへの出力

パイプからの入力と同様、デバイス 0 に対して Writeすることでパイプへ出力できます。

次のように、1秒毎に5回 $Hの値を標準出力に出力するプログラムを作りました。
PipeOut ;
  For i=1:1:5 {
    Use 0
    Write $H
,!
    Hang 1
  }
  Quit
このプログラムを実行し、出力を sort -r コマンドに渡して降順にソートしてみます。
$ cache -U USER PipeOut^TEST | sort -r
62694,74790
62694,74789
62694,74788
62694,74787
62694,74786
うまくソートできました。

リダイレクション

パイプとリダイレクションはいずれも標準入力を経由するものですので、Cache'から見るとパイプと使い方は変わりません。
そのため先程のプログラムをそのまま使用することができます。
$ free > 1.txt
$ cache -U USER PipeIn^TEST <1.txt
$ cache

USER> zw ^x
^x(1)=" total used free shared buffers cached"
^x(2)="Mem: 4044532 2341828 1702704 0 177252 612720"
^x(3)="-/+ buffers/cache: 1551856 2492676"
^x(4)="Swap: 786424 0 786424"
^x(5)=""
$ cache -U USER PipeOut^TEST > 1.txt
$ cat 1.txt
62694,81243
62694,81244
62694,81245
62694,81246
62694,81247

 リダイレクションの機能として、標準エラー出力をリダイレクトすることができるのですが、Cache'で標準エラー出力に出力する方法は不明です。。。



[an error occurred while processing this directive] [an error occurred while processing this directive]
2014/02/04Update