summaryrefslogtreecommitdiff
path: root/prelude.rb
blob: cbdddef8ab4622876245b0cd28979afd939e3ead (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# currently empty

module Process
  # call-seq:
  #    Process.daemon()			       => 0
  #    Process.daemon(nochdir=nil,noclose=nil) => 0
  # 
  # Detach the process from controlling terminal and run in
  # the background as system daemon.  Unless the argument
  # nochdir is true (i.e. non false), it changes the current
  # working directory to the root ("/"). Unless the argument
  # noclose is true, daemon() will redirect standard input,
  # standard output and standard error to /dev/null.
  # Return zero on success, or raise one of Errno::*.
  def self.daemon(nochdir = nil, noclose = nil)
    if $SAFE >= 2
      raise SecurityError, "Insecure operation `%s' at level %d", __method__, $SAFE
    end

    fork && exit!(0)

    Process.setsid()

    fork && exit!(0)

    Dir.chdir('/') unless nochdir

    File.open('/dev/null', 'r+') { |f|
      STDIN.reopen(f)
      STDOUT.reopen(f)
      STDERR.reopen(f)
    } unless noclose

    return 0
  end
end