From: SATOH Fumiyasu Date: 2012-06-21T11:46:27+09:00 Subject: [ruby-list:48803] Re: setsid(2) と getsid(2) さとうふみやす @ OSSTech です。 小崎さん、田中さん、ありがとうございました。 Ruby と関係ない話でしたね。すみません…。まとめです。 * setsid(2) は既にプロセスグループリーダーの場合は 失敗して -1 を返し errno が EPERM になる。 * ジョブコントロールをサポートしたシェルから起動する コマンドは、新たなプロセスグループ上で実行される。 * よってシェルから `ruby -e "Process.setsid"` を実行すると これに該当して setsid(2) が失敗して Errno::EPERM になる。 At Wed, 20 Jun 2012 20:38:10 +0900, SATOH Fumiyasu wrote: > Ruby で Process.setsid (setsid(2)) が失敗します。 > > $ uname -a > Linux sugar 3.2.0-2-amd64 #1 SMP Mon Jun 11 17:24:18 UTC 2012 x86_64 GNU/Linux > > ruby 1.8.7 (2012-02-08 patchlevel 358) [x86_64-linux] > -e:1: undefined method `getsid' for Process:Module (NoMethodError) > > $ ruby1.9.1 -e "Process.setsid" > ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux] > -e:1:in `
': undefined method `getsid' for Process:Module (NoMethodError) あれ、実行例が間違えてました。 $ ruby1.9.1 -ve "Process.setsid" ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux] -e:1:in `setsid': Operation not permitted (Errno::EPERM) > Perl や setsid(1) では問題ありません。 > > $ perl -e 'use POSIX; POSIX::setsid || die "$!"' Perl の POSIX::setsid は setsid(2) と同じく失敗した場合は -1 を 返すので以下が正しいコードで、Ruby と同様に失敗する。 $ perl -e 'use POSIX; POSIX::setsid==-1 and die "$!"' 許可されていない操作です at -e line 1. > $ setsid true util-linux の setsid(1) は既にプロセスグループリーダーのときは fork(2) してるためその後の setsid(2) は失敗しない。 At Thu, 21 Jun 2012 05:10:12 +0900, KOSAKI Motohiro wrote: > > setsid(2) によると、EPERM になるのは呼び出したプロセスが既に > > プロセスリーダーの場合、と記載されています。それを確かめたくて > > Ruby で getsid(2) 相当で確認しようと思ったのですが、Process.getsid > > はないようです。需要がないからでしょうか? > > 理由は知りませんが、チケット切ってくれるならあとで追加するのに > やぶさかではないです 時間がとれたらやりたいと思います。 -- -- Name: SATOH Fumiyasu (fumiyas @ osstech co jp) -- Business Home: http://www.OSSTech.co.jp/ -- GitHub Home: https://GitHub.com/fumiyas/