2012年6月21日

[ruby-list:48802] Re: setsid(2) と getsid(2)

2012年6月21日 6:49 Tanaka Akira <akr@xxxxx>:

> というわけで、むしろ問題は、なぜ perl は成功するのか、ということでしょう。
>
> あと気がついたのですが、ruby を strace すると、setsid が成功したように
> 見えるのが謎です。(gdb では失敗が観測されるのですが)
>
> % strace -e setsid ruby -ve 'p Process.setsid'

> ruby 2.0.0dev (2012-03-16 trunk 35049) [x86_64-linux]
> setsid() = 6310
> 6310

おっと、この場合のプロセスグループリーダーは strace であって、
ruby ではないので、成功するのはあたりまえでした。

以下のように、setpgid で プロセスグループリーダにしてやればちゃんと失敗が
観測できます。

% strace -e setpgid,setsid ruby -ve 'Process.setpgid(0,0); p
Process.setsid'
ruby 2.0.0dev (2012-03-16 trunk 35049) [x86_64-linux]
setpgid(0, 0) = 0
setsid() = -1 EPERM (Operation not permitted)
-e:1:in `setsid': Operation not permitted (Errno::EPERM)
from -e:1:in `<main>'

perl でも同様に失敗が観測できますが、die には至りません。

% strace -e setpgid,setsid perl -e 'use POSIX; POSIX::setpgid(0,0);
POSIX::setsid || die "$!"'
setpgid(0, 0) = 0
setsid() = -1 EPERM (Operation not permitted)

POSIX::setsid は -1 つまり真を返すようなので、|| ではうまくいかないんじゃないでしょうか。

% perl -e 'use POSIX; print POSIX::setsid, "\n"; print "$!\n"'
-1
Operation not permitted
--
[田中 哲][たなか あきら][Tanaka Akira]


投稿者 xml-rpc : 2012年6月21日 07:01
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/111024
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。