Каково значение указания режима файла при повторном открытии STDOUT в /dev/null?
Я читаю пример сценария ruby, который создает демон путем разветвления, создания нового сеанса, повторного разветвления, а затем перенаправления stdin, stdout, stderr в /dev/null
Вот фрагмент перенаправления:
STDIN.reopen '/dev/null'
STDOUT.reopen '/dev/null', 'a'
STDERR.reopen '/dev/null', 'a'
Каково значение указания режима файла ('a'
) в этом случае? Поведение будет другим, например, с
STDOUT.reopen '/dev/null', 'w'
или даже
STDOUT.reopen '/dev/null'
?
1 ответ
Решение
Там нет особого значения, но это семантически полезно для читателя, который ожидал бы, что STDOUT
является append
или же write
, но нет read
, Это также защищает от дефолта (как правило, read
Изменения в будущем, вряд ли, как это может быть. На самом деле Ruby имеет защиту от изменения режима STDIN
или же STDOUT
,
STDOUT.reopen '/dev/null', 'r'
test.rb:1:in `reopen': <STDOUT> can't change access mode from "w" to "r" (ArgumentError)
from test.rb:1:in `<main>'
Это работает на других IO, и всегда приятно быть явным.
f = File.open('file.out', 'w')
f.puts 'Hi'
f.close
f.reopen('file.out', 'r')
puts f.read
$ ruby test.rb
Hi