Почему Process.setsid требует привилегий root в ruby?

В Ruby вызов Process.setsidзавершается с ошибкой «Операция не разрешена», если она выполняется от имени не суперпользователя. Попробуйте:

$ irb
irb(main):001:0> Process.setsid
Errno::EPERM: Operation not permitted
    from (irb):1:in `setsid'
    from (irb):1
    from ~/.rbenv/versions/1.9.2-p290/bin/irb:12:in `
'

Или с той же ошибкой, если я изменю uid или процесс, используя метод Process.uid=.Он отлично работает, если я запускаю программу Ruby от имени пользователя root и не меняю UID процесса во время выполнения.

Однако в оболочке Ubuntu или некоторых других дистрибутивов программа setsid(ссылка: http://linux.die.net/man/2/setsid) не требует привилегии суперпользователя.

Насколько я понимаю, stdsidсбрасывает сеанс программы, что также полезно при демонизации процесса. В моем коде я пытаюсь изменить UID, а также демонизировать его, а также сбросить сеанс.

Следовательно, мне любопытно, почему Process.setsidтребует указанных привилегий, а программа setsidв большинстве UNIX-подобных ОС — нет.

5
задан Gurpartap Singh 21 June 2012 в 16:22
поделиться