[#352] ruby 1.1a5 released — matz@... (Yukihiro Matsumoto)
まつもと ゆきひろです
38 messages
1997/09/01
[#353] Re: ruby 1.1a5 released
— keiju@... (石塚圭樹 )
1997/09/01
[#354] Re: ruby 1.1a5 released
— matz@... (Yukihiro Matsumoto)
1997/09/01
まつもと ゆきひろです
[#355] methods [Re: ruby 1.1a5 released]
— keiju@... (石塚圭樹 )
1997/09/01
けいじゅ@日本ラショナルソフトウェアです.
[#356] Re: methods [Re: ruby 1.1a5 released]
— matz@... (Yukihiro Matsumoto)
1997/09/01
まつもと ゆきひろです
[#357] Re: methods [Re: ruby 1.1a5 released]
— keiju@... (Keiju ISHITSUKA)
1997/09/01
けいじゅ@日本ラショナルソフトウェアです.
[#359] Re: methods [Re: ruby 1.1a5 released]
— matz@... (Yukihiro Matsumoto)
1997/09/02
まつもと ゆきひろです
[#363] Re: methods [Re: ruby 1.1a5 released]
— matz@... (Yukihiro Matsumoto)
1997/09/02
まつもと ゆきひろです
[#374] Re: methods [Re: ruby 1.1a5 released]
— matz@... (Yukihiro Matsumoto)
1997/09/02
まつもと ゆきひろです
[#376] Re: methods [Re: ruby 1.1a5 released]
— keiju@... (Keiju ISHITSUKA)
1997/09/02
けいじゅ@日本ラショナルソフトウェアです.
[#382] Re: methods [Re: ruby 1.1a5 released]
— matz@... (Yukihiro Matsumoto)
1997/09/02
まつもと ゆきひろです
[#390] Re: methods [Re: ruby 1.1a5 released]
— keiju@... (Keiju ISHITSUKA)
1997/09/03
けいじゅ@日本ラショナルソフトウェアです.
[#391] Re: methods [Re: ruby 1.1a5 released]
— matz@... (Yukihiro Matsumoto)
1997/09/03
まつもと ゆきひろです
[#405] nesting [methods [Re: ruby 1.1a5 released]]
— keiju@... (石塚圭樹 )
1997/09/04
けいじゅ@日本ラショナルソフトウェアです.
[#406] Re: nesting [methods [Re: ruby 1.1a5 released]]
— matz@... (Yukihiro Matsumoto)
1997/09/04
まつもと ゆきひろです
[#411] Re: nesting [methods [Re: ruby 1.1a5 released]]
— keiju@... (石塚圭樹 )
1997/09/04
けいじゅ@日本ラショナルソフトウェアです.
[#358] defined? — keiju@...
けいじゅ@日本ラショナルソフトウェアです.
7 messages
1997/09/01
[#389] ruby 1.1a6 released — matz@... (Yukihiro Matsumoto)
まつもと ゆきひろです
6 messages
1997/09/03
[#417] [BUG] *methods — keiju@... (Keiju ISHITSUKA)
けいじゅ@日本ラショナルソフトウェアです.
6 messages
1997/09/04
[#418] building ext modules — Eiji-usagi-MATSUmoto <ematsu@...>
うさぎです。
7 messages
1997/09/05
[#431] [Q] socket on ruby(mswin32) — Masaki Suketa <suke@...>
助田です。
9 messages
1997/09/09
[#441] How to report a bug — takagi@... (TAKAGI Hiromitsu)
Bus error が出ました。
15 messages
1997/09/09
[#447] Re: How to report a bug
— matz@... (Yukihiro Matsumoto)
1997/09/10
まつもと ゆきひろです
[#461] [Q] ruby-socket(mswin32) — Masaki Suketa <suke@...>
助田です
27 messages
1997/09/11
[#462] Re: [Q] ruby-socket(mswin32)
— matz@... (Yukihiro Matsumoto)
1997/09/11
まつもと ゆきひろです
[#463] Re: [Q] ruby-socket(mswin32)
— Masaki Suketa <suke@...>
1997/09/11
助田です
[#464] Re: [Q] ruby-socket(mswin32)
— matz@... (Yukihiro Matsumoto)
1997/09/11
まつもと ゆきひろです
[#467] Re: [Q] ruby-socket(mswin32)
— WATANABE Hirofumi <watanabe@...>
1997/09/11
わたなべです.
[#468] Re: [Q] ruby-socket(mswin32)
— matz@... (Yukihiro Matsumoto)
1997/09/11
まつもと ゆきひろです
[#469] Re: [Q] ruby-socket(mswin32)
— WATANABE Hirofumi <watanabe@...>
1997/09/11
わたなべです.
[#475] Re: [Q] ruby-socket(mswin32)
— WATANABE Hirofumi <watanabe@...>
1997/09/11
わたなべです.
[#476] Re: [Q] ruby-socket(mswin32)
— Masaki Suketa <suke@...>
1997/09/12
助田です。まとめてレスします。(ちょっと長いです)
[#477] Re: [Q] ruby-socket(mswin32)
— WATANABE Hirofumi <watanabe@...>
1997/09/12
わたなべです.
[#489] [BUG] thread? — keiju@... (Keiju ISHITSUKA)
けいじゅ@日本ラショナルソフトウェアです.
5 messages
1997/09/16
[#499] parser bug — keiju@... (Keiju ISHITSUKA)
けいじゅ@日本ラショナルソフトウェアです.
8 messages
1997/09/18
[#501] MethodIndex — keiju@... (Keiju ISHITSUKA)
けいじゅ@日本ラショナルソフトウェアです.
5 messages
1997/09/18
[#522] Re: Assigne to special variable — "EGUCHI Osamu" <eguchi@...>
えぐち です。
12 messages
1997/09/24
[#571] dbmtest.rb — Masaki Suketa <suke@...>
いまだ ruby(Perl?) のソースコード追っかけてる時間の方が長い
11 messages
1997/09/30
[#572] Re: dbmtest.rb
— WATANABE Hirofumi <watanabe@...>
1997/09/30
わたなべです.
[#573] Re: dbmtest.rb
— matz@... (Yukihiro Matsumoto)
1997/09/30
まつもと ゆきひろです
[#585] Re: optimize (Re: Assigne to special variable) — "EGUCHI Osamu" <eguchi@...>
えぐち です
4 messages
1997/09/30
[#594] BUG?(marshal) — Masaki Suketa <suke@...>
以下のプログラムを実行した時に(3)と(4)で出力結果が違います。
17 messages
1997/09/30
[#595] Re: BUG?(marshal)
— matz@... (Yukihiro Matsumoto)
1997/09/30
まつもと ゆきひろです
[#596] Re: BUG?(marshal)
— WATANABE Hirofumi <watanabe@...>
1997/09/30
わたなべです.
[#601] Re: BUG?(marshal)
— Masaki Suketa <suke@...>
1997/10/01
助田です。
[#602] Re: BUG?(marshal)
— matz@... (Yukihiro Matsumoto)
1997/10/01
まつもと ゆきひろです
[ruby-dev:457] Re: open, close, waitpid?
From:
matz@... (Yukihiro Matsumoto)
Date:
1997-09-11 01:27:43 UTC
List:
ruby-dev #457
まつもと ゆきひろです
In message "[ruby-dev:452] Re: open, close, waitpid?"
on 97/09/10, WATANABE Hirofumi <watanabe@ase.ptg.sony.co.jp> writes:
|わたなべです.
|謎ですね.
謎はすべて解けたっ! ^^;;;
いやあ,実に簡単な見落としでした.布団の中でひらめいたという.
添付のパッチで直ります.
原因を解説すると
* 最初のopen("|cat", "w")でfdがオープンされます
* 次のopen("|sed 's/a/b/'", "w")で生成されたプロセスにcat
と繋がったfdが引き継がれます.
* 親がf1(catのfd)をcloseしてもsedのプロセスではまだopenし
たままになっていますので,fdはcloseされません(fdの全部の
コピーがcloseされないと実際のcloseは起きない).
* f2を先にcloseするとプロセスがいなくなるので,catのfdへの
参照は親だけになり,closeと同時にプロセスが終了する.
となっていました.対策としてはfdをオープンするたびにfcntlで
F_SETFD(close-on-exec)を設定しました.F_SETFDのないプラット
フォームではexecする前にcloseするようにしました.
まつもと ゆきひろ /:|)
--- io.c~ Tue Sep 9 18:03:55 1997
+++ io.c Thu Sep 11 10:22:35 1997
@@ -21,3 +21,3 @@
#endif
-#if defined(THREAD) && defined(HAVE_FCNTL)
+#if defined(HAVE_FCNTL)
#include <fcntl.h>
@@ -45,2 +45,8 @@
+#ifdef HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#else
+# define NOFILE 64
+#endif
+
VALUE rb_ad_string();
@@ -759,2 +765,5 @@
}
+#if defined(HAVE_FCNTL) && defined(F_SETFD)
+ fcntl(fileno(f),F_SETFD,fileno(f) >= 3);
+#endif
return f;
@@ -778,2 +787,5 @@
}
+#if defined(HAVE_FCNTL) && defined(F_SETFD)
+ fcntl(fd,F_SETFD,fd >= 3);
+#endif
return f;
@@ -909,4 +919,6 @@
close(pr[0]);
- dup2(pr[1], 1);
- close(pr[1]);
+ if (pr[1] != 1) {
+ dup2(pr[1], 1);
+ close(pr[1]);
+ }
}
@@ -914,4 +926,6 @@
close(pw[1]);
- dup2(pw[0], 0);
- close(pw[0]);
+ if (pw[0] != 0) {
+ dup2(pw[0], 0);
+ close(pw[0]);
+ }
}
@@ -919,4 +933,4 @@
if (doexec) {
- VALUE fd = io_fileno(rb_stderr);
- int f = FIX2INT(fd);
+ VALUE serr = io_fileno(rb_stderr);
+ int fd = FIX2INT(serr);
extern char *sourcefile;
@@ -924,7 +938,12 @@
- if (f != 2) {
+ if (fd != 2) {
close(2);
- dup2(f, 2);
- close(f);
+ dup2(fd, 2);
+ close(fd);
}
+
+#if !defined(HAVE_FCNTL) || !defined(F_SETFD)
+ for (fd = 3; fd < NOFILE; fd++)
+ close(fd);
+#endif
rb_proc_exec(pname);
@@ -954,4 +973,2 @@
MakeOpenFile(port, fptr);
- if (modef & FMODE_READABLE) close(pr[1]);
- if (modef & FMODE_WRITABLE) close(pw[0]);
fptr->mode = modef;
@@ -960,6 +977,12 @@
- if (modef & FMODE_READABLE) fptr->f = rb_fdopen(pr[0], "r");
+ if (modef & FMODE_READABLE) {
+ close(pr[1]);
+ fptr->f = rb_fdopen(pr[0], "r");
+ }
if (modef & FMODE_WRITABLE) {
- if (fptr->f) fptr->f2 = rb_fdopen(pw[1], "w");
- else fptr->f = rb_fdopen(pw[1], "w");
+ FILE *f = rb_fdopen(pw[1], "w");
+
+ close(pw[0]);
+ if (fptr->f) fptr->f2 = f;
+ else fptr->f = f;
}
@@ -1885,2 +1908,7 @@
rb_sys_fail(0);
+
+#if defined(HAVE_FCNTL) && defined(F_SETFD)
+ fcntl(pipes[0],F_SETFD,pipes[0] >= 3);
+ fcntl(pipes[1],F_SETFD,pipes[1] >= 3);
+#endif
r = prep_stdio(fdopen(pipes[0], "r"), FMODE_READABLE);