[ruby-list:48803] Re: setsid(2) と getsid(2)
From:
SATOH Fumiyasu <fumiyas@...>
Date:
2012-06-21 02:46:27 UTC
List:
ruby-list #48803
さとうふみやす @ 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 `<main>': 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/