2011-07-13 9 views

答えて

3

$stdout.write("Buffered") 
$stdout = $stderr 
$stdout.write("After assignment") 

$stdout.write("Buffered") 
$stdout.reopen($stderr) 
$stdout.write("After reopen") 

をしたがって、基本的となり仲間$stdoutを再開newfileストリーム=>$stdoutおよびnewfileは、同じストリームに関連付けられた2つのFileインスタンスになります。

=は、実際には同じファイルのインスタンスを指す2つの変数になります$stdout =>$stdoutnewfilenewfile Fileインスタンスを割り当てます。

帰結:

reopenインスタンス上の任意の変化(すなわち、ストリーム自体に影響を与えない)を使用して、他のインスタンスには反映されません。

=例:

a = File.new('name') 
b = File.new('name') 

a.lineno #=> 0 
b.lineno #=> 0 

a.lineno = 3 

a.lineno #=> 3 
b.lineno #=> 0 

b = a 

a.lineno #=> 3 
b.lineno #=> 3 

a.lineno = 0 

a.lineno #=> 0 
b.lineno #=> 0 

reopen例:あなたは子プロセスを実行しているとき

a = File.new('name') 
b = File.new('name') 

a.lineno #=> 0 
b.lineno #=> 0 

a.lineno = 3 

a.lineno #=> 3 
b.lineno #=> 0 

b.reopen(a) 

a.lineno #=> 3 
b.lineno #=> 3 

a.lineno = 0 

a.lineno #=> 0 
b.lineno #=> 3 
+0

「sync」オプションは、これら2つのストリームリダイレクト方法とどのように機能しますか? – jrdioko

+1

@jrdioko 'sync'は' File'インスタンスを介してwriteメソッドを呼び出すたびにファイルに書き込みます。両方とも、 'reopen'と' = 'は' sync'値をターゲット 'File'インスタンスに"コピー "します。ポイントへ行く: '='を使うと、両方の変数で同じ 'File'を扱うので、両方のいずれかに書き込むたびにストリームポインタが更新されます。 'reopen'を使うと、もう一方の位置を変更せずにそれらのうちの1つに書き込むことができます。そうすれば、もう一方に書き込むと、前の内容を上書きしてしまいます。 – robertodecurnex

0

前IOするフラッシュと私は信じ後者(reopen)場合に閉じられます。

を追加しました:の出力の比較:(比較するための最良の方法は、パイプを使用して出力をリダイレクトすることである)

0

差が重要です。

割り当て:

$stdout = File.open("/dev/null", "w") 
system "ls" 
warn $stdout.fileno # file descriptor number 

出力 - systemの出力はまだ登場どのように気づく:

1.txt 2.txt 
7 

再オープン: - 番目

$stdout.reopen("/dev/null") 
system "ls" 
warn $stdout.fileno 

出力をsystem出力eは/dev/nullに送信されました:

1 

概要:$stdout$stdin、または$stderr

再割り当ては、現在のルビープロセスに影響を与えます。子プロセスは、独自の標準出力をファイル記述子(FD)1に書き込み、FD 0から標準入力を読み込み、FD 2に診断出力を書き出します。

変更を継承するには、再オープンする必要がありますそのストリームは、ファイル記述子を再利用するためです。あなたが子供を始めての前にreopenの場合、子供にのみ影響があることに注意してください。

1つの使用例:デーモンスクリプト(またはログアウトしても実行し続ける必要のある他のスクリプト)を作成しています。ベストプラクティスは、3つの標準ストリームをすべて/dev/nullに再度開くことです。そうしないと、スクリプトまたは子プロセスがストリームを使用しようとするとパイプが壊れる可能性があります。

関連する問題