From: Koji Arai Date: 2000-06-12T00:31:10+09:00 Subject: [ruby-list:23150] Re: description on fork and Process.fork 新井です。 >>> From: ARIMA Yasuhiro >>> Date: 11 Jun 2000 18:21:49 +0900 >>> Subject: [ruby-list:23148] Re: description on fork and Process.fork > 有馬です。 > > matz@netlab.co.jp (Yukihiro Matsumoto) wrote > > | すべきか、つまり統一後の見え方はどうあるべきかが一意に決まら > | ない場合は難しいですねえ。 インタフェースは、 int setpgid(pid_t pid, pid_t pgid); pid_t getpgid(pid_t pid); int setpgrp(void); pid_t getpgrp(void); に統一してしまっても良い気はします。 (自分がそういうインタフェースを使ってるからだけど^^;) > あるべき姿はよくわからないまま、以下のようなものを書いて > Solaris, FreeBSD, Linux で使ってます。 > > def daemon( dir="/", noclose=false, mask=0 ) > exit! if fork > Process::setsid > exit! if fork そうそう、私もセッションリーダを止めるため(2度と制御端末を open()しないため)、setsid()の後fork()するよう習いました。(し かも、セッションリーダが終了するときSIGHUPを投げるからSIGHUP を事前にtrapするとも) # SOFTBANK 「詳解 UNIXネットワークプログラミング」で習いました。 # ISBN4-89052-780-X # これSystemVな本ですが、他だと違うのですかね? 普通、自分がconsoleとかをopen()しないことがわかっているから そういうことはしないのでしょうね。今みたら、 glibc-2.1.3/misc/daemon.cのdaemon()では、こういうことはして ないですね。 ところで、setsid() って以下でよい? # これは、UNIX Magazine 1996.4 で習いました(古い) setsid() { pid_t sid; sid = setpgrp(0, getpid()); /* or setpgrp(); */ if (sid == -1) return -1; if ((fd = open("/dev/tty", O_RDWR)) >= 0) { ioctl(fd, TIOCNOTTY, NULL); close(fd); } return sid; } -- 新井康司 (Koji Arai)