[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/

In This Thread

Prev Next