2012年6月21日

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

よく知らないのですが

2012/6/20 SATOH Fumiyasu <fumiyas@xxxxx>:
> さとうふみやす @ OSSTech です。
>
> 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
>
> $ ruby1.8 -e "Process.setsid"
> 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)
>
> Perl や setsid(1) では問題ありません。
>
> $ perl -e 'use POSIX; POSIX::setsid || die "$!"'
>
> $ setsid true
>
> setsid(2) によると、EPERM になるのは呼び出したプロセスが既に
> プロセスリーダーの場合、と記載されています。それを確かめたくて
> Ruby で getsid(2) 相当で確認しようと思ったのですが、Process.getsid
> はないようです。需要がないからでしょうか?

理由は知りませんが、チケット切ってくれるならあとで追加するのに
やぶさかではないです


> $ ruby1.9.1 -e 'p Process.getsid'
> -e:1:in `<main>': undefined method `getsid' for Process:Module (NoMethodError)
>
> それはともかく、Ruby プロセスの起動から終了までのシステムコール
> トレースを見たのですが、プロセスリーダーになっている様子が
> ありません。上記のように Process.setsid が失敗する原因は
> 何かわかりますでしょうか。

原因はまったくわかりませんが、

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

main()
{
int err;

printf("getpid()=%d\n", getpid());
printf("getpgid()=%d\n", getpgid(0));
err = setsid();
printf("%d, %d\n", err, errno);
return 0;
}

というCプログラムが

getpid()=2319
getpgid()=2319
-1, 1

という結果を返すのでRubyと全然関係ない話なんじゃないですかね


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




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