Project

General

Profile

Bug #1403

Process.daemon should do a double fork to avoid problems with controlling terminals

Added by gwright (Gary Wright) over 11 years ago. Updated over 9 years ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
ruby -v:
ruby 1.9
Backport:
[ruby-core:23305]

Description

=begin
Standard practice when 'daemonizing' is to do a second fork so that the final process is no longer a session leader and therefore can't acquire a new controlling terminal.

See Stevens, Advanced Programming in the Unix Environment for details.
=end

#1

Updated by nobu (Nobuyoshi Nakada) over 11 years ago

=begin
Hi,

At Sat, 25 Apr 2009 08:06:36 +0900,
Gary Wright wrote in [ruby-core:23305]:

Author: Gary Wright
Status: Open, Priority: Normal
ruby -v: ruby 1.9.0 (2008-07-25 revision 18217) [i686-darwin9]

Standard practice when 'daemonizing' is to do a second fork
so that the final process is no longer a session leader and
therefore can't acquire a new controlling terminal.

See Process.setsid. Process.daemon implies it.

And daemon(3) is deprecated on Darwin.

--
Nobu Nakada

=end

#2

Updated by nobu (Nobuyoshi Nakada) over 11 years ago

=begin
Hi,

At Sat, 25 Apr 2009 09:52:46 +0900,
Gary Wright wrote in [ruby-core:23307]:

Author: Gary Wright
Status: Open, Priority: Normal
ruby -v: ruby 1.9.0 (2008-07-25 revision 18217) [i686-darwin9]

Standard practice when 'daemonizing' is to do a second fork
so that the final process is no longer a session leader and
therefore can't acquire a new controlling terminal.

See Process.setsid. Process.daemon implies it.

setsid is not sufficient. That makes the child process a session

leader, establishes a new process group, and breaks the association

with the controlling terminal, but it doesn't prevent the process from

acquiring a controlling terminal if it should happen to open a tty

device (generally on system V based systems, BSD systems are different).

Then `i686-darwin9' is irrelevant at all?

The second fork ensures that the process (the grandchild of the

original process) is no longer a session leader and therefore can't

acquire a controlling terminal by opening a tty device.

Could you show concrete example?

--
Nobu Nakada

=end

#3

Updated by nobu (Nobuyoshi Nakada) over 11 years ago

  • Category set to core
  • Target version set to 1.9.2
  • ruby -v changed from ruby 1.9.0 (2008-07-25 revision 18217) [i686-darwin9] to ruby 1.9

=begin

=end

#4

Updated by nobu (Nobuyoshi Nakada) over 11 years ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100

=begin
Applied in changeset r23280.
=end

Also available in: Atom PDF