Shiro Kawai
shiro****@lava*****
2004年 6月 24日 (木) 20:25:26 JST
From: shelarcy <shela****@capel*****> Subject: [Gauche-devel-jp] fork とか pipe の方はどうしましょうか? Date: Thu, 24 Jun 2004 19:22:18 +0900 > 同様の問題は fork とか pipe の方でも起こりますが、解決策がありそうな > のでこちらはどうにかしたいと思います。 fork, pipeはかなりきついと思うので、当面サポート無しでも良いのでは? 特にforkは、Cygwinではかなりアクロバティックな方法をとっていたと思います。 コードを読んだわけではないんですが、ドキュメントのどこかでちらっと 触れられていたような。 > Win32 pipeの覚書 > http://nhiro4.ld.infoseek.co.jp/program/windows/pipe.html ここに書かれている方法だとすると使うのは難しいと思います。 まず、Unixのforkのセマンティクスは、現在実行中のプロセスの複製を 作るというものです。CreateProcessは、fork+execに相当すると思います。 fork()に相当するシステムコールはWindowsにあるのでしょうか? (現実には、スレッドとの絡みで、Schemeレベルからsys-forkとsys-execを 別々に呼ぶことは推奨していません。fork+execをアトミックに行う sys-fork-and-execというのを用意してあって、ほとんどの場合は それで事足りるんじゃないかと思います。従って、sys-forkはサポート せずにsys-fork-and-execだけをサポートするってのはありかもしれません。 ただ、sys-waitのセマンティクスも難しそうな気がします) もう一つの問題は、上記の方法でパイプを作ったとしても、Schemeから アクセス可能にするためには、HANDLEの上にポートAPIを構築しなければ ならないということです。(GaucheはFILE*構造体を使うbuffered I/O (fprintf, fwrite, fread, fgets, getchar, putchar等) を利用せず、 Unixのファイルディスクリプタ上に直接I/Oルーチンを組んでいます)。 と、書いてて気づいたんですが、port回りは無事ビルドできたんでしょうか。 ということはMinGWがHANDLEからfile descriptorへのアダプタレイヤを 提供してくれているのかな。それなら何とかなるかもしれません。 同様に、MinGWがfork()のセマンティクスも提供してくれているなら 話は速いんですが。 ところで、Gaucheが抽象度の高いルーチンではなくなるべくPOSIXレイヤを 直接Schemeに見せているのは、私個人がスクリプトを業務で書いていて、 しばしば「痒いところに手を届かせたかった」経験を持っていることに よります。そこから類推すると、Gauche/win32はPOSIXエミュレーション レイヤをがんばるよりも、WindowsのネイティブシステムコールをSchemeに 見せる方向に向かう方が充実するかもしれません。 「どちらでも動く」スクリプトのためには、Schemeレベルで抽象化レイヤを 書いてがんばる、と。どのくらいそれが可能かどうかはわかりませんが。 --shiro