2

我正在阅读一个示例 ruby​​ 脚本,该脚本通过分叉创建一个守护进程,创建一个新会话,再次分叉,然后将标准输入、标准输出、标准错误重定向到 /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'

?

4

1 回答 1

1

没有特别的意义,但它对那些期望STDOUTis appendor write,但不是的读者在语义上很有帮助read。它还可以防御默认(通常read)在未来发生变化,尽管这不太可能。事实上,Ruby 有防止改变STDINor模式的保护措施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
于 2016-04-09T06:55:10.207 回答