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

From: Tanaka Akira <akr@...>
Date: 2012-06-20 22:01:26 UTC
List: ruby-list #48802
2012年6月21日 6:49 Tanaka Akira <akr@fsij.org>:

> というわけで、むしろ問題は、なぜ 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]

In This Thread