From: Koji Arai Date: 2000-06-12T03:58:08+09:00 Subject: [ruby-list:23159] Re: description on fork and Process.fork 新井です。 >>> From: Koji Arai >>> Date: 12 Jun 2000 03:00:07 +0900 >>> Subject: [ruby-list:23158] Re: description on fork and Process.fork > 新井です。 > > >>> From: matz@netlab.co.jp (Yukihiro Matsumoto) > >>> Date: 12 Jun 2000 00:58:53 +0900 > >>> Subject: [ruby-list:23151] Re: description on fork and Process.fork > ruby は、Cと違って引数の省略が可能なのでやっぱり、 > Process.setpgrp([pid, pgid]) > Process.getpgrp([pid]) > の方がわかりやすいかもしれないですね。 ついでに書いてみました(動作確認はしてません) # 昼間寝すぎて眠れないらしい Index: process.c =================================================================== RCS file: /home/cvs/ruby/process.c,v retrieving revision 1.14 diff -u -p -u -r1.14 process.c --- process.c 2000/05/24 04:34:05 1.14 +++ process.c 2000/06/11 18:55:58 @@ -49,6 +49,38 @@ struct timeval rb_time_interval _((VALUE #undef HAVE_GETPGRP #endif +#ifdef HAVE_GETPGID +#define rb_getpgid(pid) getpgid(pid) +#else +#if defined(HAVE_GETPGRP) && !defined(GETPGRP_VOID) +#define rb_getpgid(pid) getpgrp(pid) +#endif +#endif + +#ifdef HAVE_SETPGID +#define rb_setpgid(pid, pgid) setpgid(pid, pgid) +#else +#if defined(HAVE_SETPGRP) && !defined(SETPGRP_VOID) +#define rb_setpgid(pid, pgid) setpgrp(pid, pgid) +#endif +#endif + +#ifdef HAVE_GETPGRP +#ifdef GETPGRP_VOID +#define rb_getpgrp() getpgrp() +#else +#define rb_getpgrp() getpgrp(0) +#endif +#endif + +#ifdef HAVE_SETPGRP +#ifdef SETPGRP_VOID +#define rb_setpgrp() setpgrp() +#else +#define rb_setpgrp() setpgrp(0, getpid()) +#endif +#endif + static VALUE get_pid() { @@ -746,24 +778,22 @@ proc_getpgrp(argc, argv) int argc; VALUE *argv; { -#ifdef HAVE_GETPGRP int pgrp; -#ifndef GETPGRP_VOID +#if defined(rb_getpgid) VALUE vpid; int pid; rb_scan_args(argc, argv, "01", &vpid); pid = NIL_P(vpid)?0:NUM2INT(vpid); - pgrp = getpgrp(pid); -#else + pgrp = rb_getpgid(pid); +#elif defined(rb_getpgrp) rb_scan_args(argc, argv, "0"); - pgrp = getpgrp(); -#endif - if (pgrp < 0) rb_sys_fail(0); - return INT2FIX(pgrp); + pgrp = rb_getpgrp(); #else rb_notimplement(); #endif + if (pgrp < 0) rb_sys_fail(0); + return INT2FIX(pgrp); } static VALUE @@ -771,8 +801,7 @@ proc_setpgrp(argc, argv) int argc; VALUE *argv; { -#ifdef HAVE_SETPGRP -#ifndef SETPGRP_VOID +#if defined(rb_setpgid) VALUE pid, pgrp; int ipid, ipgrp; @@ -780,47 +809,14 @@ proc_setpgrp(argc, argv) ipid = NIL_P(pid)?0:NUM2INT(pid); ipgrp = NIL_P(pgrp)?0:NUM2INT(pgrp); - if (setpgrp(ipid, ipgrp) < 0) rb_sys_fail(0); -#else + if (rb_setpgid(ipid, ipgrp) < 0) rb_sys_fail(0); +#elif defined(rb_setpgrp) rb_scan_args(argc, argv, "0"); - if (setpgrp() < 0) rb_sys_fail(0); -#endif - return INT2FIX(0); -#else - rb_notimplement(); -#endif -} - -static VALUE -proc_getpgid(obj, pid) - VALUE obj, pid; -{ -#ifdef HAVE_GETPGID - int i; - - i = getpgid(NUM2INT(pid)); - return INT2NUM(i); + if (rb_setpgrp() < 0) rb_sys_fail(0); #else rb_notimplement(); #endif -} - -static VALUE -proc_setpgid(obj, pid, pgrp) - VALUE obj, pid, pgrp; -{ -#ifdef HAVE_SETPGID - int ipid, ipgrp; - - rb_secure(2); - ipid = NUM2INT(pid); - ipgrp = NUM2INT(pgrp); - - if (setpgid(ipid, ipgrp) < 0) rb_sys_fail(0); return INT2FIX(0); -#else - rb_notimplement(); -#endif } static VALUE @@ -1040,8 +1036,8 @@ Init_process() rb_define_module_function(rb_mProcess, "getpgrp", proc_getpgrp, -1); rb_define_module_function(rb_mProcess, "setpgrp", proc_setpgrp, -1); - rb_define_module_function(rb_mProcess, "getpgid", proc_getpgid, 1); - rb_define_module_function(rb_mProcess, "setpgid", proc_setpgid, 2); + rb_define_alias(rb_mProcess, "getpgid", "getpgrp"); + rb_define_alias(rb_mProcess, "setpgid", "setpgrp"); rb_define_module_function(rb_mProcess, "setsid", proc_setsid, 0); -- 新井康司 (Koji Arai)