まつもと ゆきひろです

In message "[ruby-list:4246] Re: ruby-tk on Windows"
    on 97/09/09, KIMURA Koichi <kkimura / pure.cpdc.canon.co.jp> writes:
|木村です。

|ところでまつもとさんのメイルにあった
|
|	In [ruby-list:4244] 
|
|>  * popenを使っている実装では終了時にpcloseを呼ぶ
|
|これは、rubyインタープリターがpcloseを呼んでくれる。という
|ことですか?
|#なんとなくそう読めてしまうので…

そうです.いやあ,言ってみるもんだ.できてしまった.
全然テストしていないコードだと以下のような感じです
# ruby-devのノリだな

--- io.c~	Tue Sep  9 16:38:23 1997
+++ io.c	Tue Sep  9 18:03:55 1997
@@ -782,2 +782,42 @@
 #if defined (NT) || defined(DJGPP)
+static struct pipe_list {
+    OpenFile *fptr;
+    struct pipe_list *next;
+} *pipe_list;
+
+static void
+pipe_add_fptr(fptr)
+    OpenFile *fptr;
+{
+    struct pipe_list *list;
+
+    list = ALLOC(struct pipe_list);
+    list->fptr = fptr;
+    list->next = pipe_list;
+    pipe_list = list;
+}
+
+static void
+pipe_del_fptr(fptr)
+    OpenFile *fptr;
+{
+    struct pipe_list *list = pipe_list;
+    struct pipe_list *tmp;
+
+    if (list->fptr == fptr) {
+	pipe_list = list->next;
+	return;
+    }
+
+    while (list->next) {
+	if (list->next->fptr == fptr) {
+	    tmp = list->next;
+	    list->next = list->next->next;
+	    free(tmp);
+	    return;
+	}
+	list = list->next;
+    }
+}
+
 static void
@@ -793,2 +833,19 @@
     fptr->f = fptr->f2 = NULL;
+    pipe_del_fptr(fptr);
+}
+
+static void
+pipe_fptr_atexit()
+{
+    struct pipe_list *list = pipe_list;
+
+    while (list) {
+	if (list->fptr->f != NULL) {
+	    pclose(list->fptr->f);
+	}
+	if (list->fptr->f2 != NULL) {
+	    pclose(list->fptr->f2);
+	}
+	list = list->next;
+    }
 }
@@ -2204,2 +2261,6 @@
     Init_File();
+
+#if defined (NT) || defined(DJGPP)
+    atexit(pipe_fptr_atexit);
+#endif
 }