[Gauche-devel-jp] Re: fork とか pipe の方はどうしましょうか?

Back to archive index

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





Gauche-devel-jp メーリングリストの案内
Back to archive index