2009年4月12日日曜日

Limbo でパイプを扱う

どう書く.org
http://ja.doukaku.org/127/
指定コマンドを別プロセスで起動

を考えてみました。
以前の投稿
http://inferno-hell.blogspot.com/2009/03/blog-post.html
をベースにしてみました。

パイプでのやり取りが難しく、結局C言語(posix)っぽくなりました。
明示的にパイプをクローズするのが簡単にはできないようではまりました。

以下コードです。
インデントがうまくいかなく、みづらいので、
気になる方はどう書く.orgの方の参照お願いします。
http://ja.doukaku.org/comment/8800/


implement d127;

include "sys.m";
sys: Sys;
include "draw.m";
include "sh.m";
sh: Sh;

d127: module{
init: fn(ctx: ref Draw->Context, argv: list of string);
};

init (ctx: ref Draw->Context, argv: list of string)
{
sys = load Sys Sys->PATH;
sh = load Sh Sh->PATH;
buf := array[64] of byte;
fds := array[2] of ref Sys->FD;

argv = tl argv;
if(argv == nil){
return;
}
cmd := hd argv;

sys->pipe(fds); # open pipes
spawn child(ctx, fds[0], cmd);

# Read results of child process
n: int;
fds[0] = nil;
fdd := sys->open("/dev/cons", sys->OWRITE);
for(;;){
n = sys->read(fds[1], buf, len buf);
if(n == 0){
break;
}

# print result
sys->fprint(fdd, "%s", string buf[0:n]);
}
}

child (ctx: ref Draw->Context, fd: ref Sys->FD, cmd: string)
{
# duplicate stdout to the pipe
sys->dup(fd.fd, 1);

sh->system(ctx, cmd);

# pipe close
fdn := sys->open("/dev/null", sys->OWRITE);
sys->dup(fdn.fd, 1);
fd = nil;
}


ポイントはパイプをオープンして片方を子プロセスに渡すということと、
処理終了後になんとかパイプをクローズしているところです。

ファイルやパイプをクローズするにはcloseというシステムコールはなく、
どこからも参照しなくならないようにしなければなりません。
なので、三カ所で無理矢理パイプの参照を切っています。

1. 親プロセスの中、子プロセス呼び出し後、ファイルデスクリプタにnil代入
2. 子プロセスで、stdoutをパイプではなく、/dev/nullに
3. 子プロセスで、ファイルデスクリプタにnil代入

2009年4月10日金曜日

acmeでメールの受信(未完)

OSを日常利用するのに、ブラウザとメールと日本語入力は必須です。
ブラウザはcharonがあるので良いのですが、メールをなんとかして読みたいところです。

acmeでメールを読めるというのは聞いていたのですが、実際に試したことはありません。
そこでやってみました。

Windows上のacme-sacを利用しました。
acme-sacというのはInfernoを立ち上げなくてもネイティブっぽく動くacmeです。
やっていることはVMっぽいですが。

1. サーバーの設定

/lib/ndb/localを開き、pop3= にpopサーバーを指定します。
これはドメイン名そのままでよく、!等はいらないようです。

2. ユーザー名の設定

メールアカウントの設定はよくわからなかったので、
メールアカウントとInfernoのログインユーザをあわせました。

3. acme起動、空のウィンドウを開く

acmeを起動し、Newを中クリックすると空のウィンドウが開きます。

4. Mailpop3起動

Mailpop3と打ち込んで、中クリックします。
すると、別のウィンドウでpassword: と聞かれます。

5. メール受信

パスワードを打ち込むとメールの受信が始まります。

6. でもエラー

しかし、malformed headerとか言われてしまいます。
どうやらメッセージの読み込み処理で例外が発生しているようです。

どこで失敗しているか追わなければなりません。


メール送信はMailでいいのかな?
新規ウィンドウでMailと打ち込んで中クリックすると
それっぽい画面になるのだが、put mailをクリックしても無反応。

その後いろいろいじって(結局だめ)想像だが、
メール作成画面→put mailをクリック→メール一覧画面→postクリック→送信
といった流れではないだろうか。
返信機能もあるっぽい。

2009年4月4日土曜日

Plan9界隈に盛り上がりが

Google Summer of Codeの季節のようで、plan9関連のブログの書き込みが活発に
なりました。
もちろんテーマ案にはInfernoも含まれており、Infernoで何か面白い
成果が出るのを期待しています。

なかなか時間が取れず細々としか活動していないのですが、
現状報告と今後の予定をメモしておきます。
決意表明することでモチベーションをあげるねらいがあります。

○現状

・Infernoで日本語

Infernoで日本語の入力を考えます。
キーボードデバイスをフックして、変換プログラムをはさむとできそうです。
まずはanthy, poboxについて調査中です。
limboからのパイプの使い方も学習中です(前回の書き込みが該当します)。

・ARMでInferno

armadillo実機へのポーティングは原因不明のエラーで頓挫中です。
qemuへ開発プラットフォームを移そうと、現在qemuのインストール中です。
qemuを使えばデバッガが使えるのでもう少し作業が進むかもしれません。

・Infernoの学習

ウェブ、書籍での学習も開始しました。
- vita nuovaのサイト
- 各種日本語ブログ
- Inferno programmer's notebook
- principles of Operating systems (買っちゃった)

・日常利用

まずはacmeをなるべく利用すべく、チャンスがあれば使っています。

○今後

・Infernoで日本語入力

まずはホストOSの変換サーバーを利用して日本語入力を実装。
ゆくゆくは実機でサーバーも動かしたい。
組み込みという用途を考えるとpoboxがよいのではないだろうか。
ソフトウェアキーボードでの入力も考える。
limboでのサーバー実装を考えるとなかなか作業量はありそう。

・ARMでinferno

qemuで動かし、armadilloでのエラーの原因究明を行う。
ゆくゆくはもうひとつarmボードがあるのでそちらにもポーティングしたい。
タッチパネルつきのえらくリッチなボードを借りたので
なにか成果を出したいところ。

・学習

継続