2

ご挨拶、

私はperlでSTDERRを閉じることができます;

close(STDERR)

ロジックを実行した後、もう一度開きたいと思います。どうすればいいですか?

私は試した

open(STDERR,">&STDERR");

動作しませんでした。

前もって感謝します。

4

3 に答える 3

11

なぜ STDERR を閉じたいのですか?

あなたはそれを脇に置くことができます...

open(FOO, ">/dev/null"); # or ">nul" on Windows
*TEMP = *STDERR;
*STDERR = *FOO;
... then
*STDERR = *TEMP;
于 2009-11-24T03:03:10.240 に答える
9

最初に dup し、次に dup を dup して再度開きます (エラー チェックは読者の課題として残されていますが、STDERR が利用できない場合にエラーを処理することは、欲求不満の課題になる可能性があります)。

open(my $saveerr, ">&STDERR");
close(STDERR);
open(STDERR, ">&", $saveerr);

STDERR を閉じると、ファイル記述子 2 が解放されることに注意してください。別のファイルを開いてファイル記述子 2 を取得すると、使用している Perl 以外のライブラリが他のファイルを stderr と見なす可能性があります。

于 2009-11-24T03:39:19.760 に答える
1

STDERR は、親プロセスによって提供されます。必ずしも通常のファイルであるとは限らないため、今後書き込む予定がない限り、開いたままにしておくことをお勧めします。正直に言うと、ttyシェル コマンドをいじるのは避けて、ここで /dev/pts/XX を再度開くことをお勧めします。

あなたがやりたいことは、ライブラリがSTDERRで出力を生成するように設計されているときに、出力を生成しないようにすることだと思います。そのためには、ファイルを開いたままにしておく必要がありますが、ファイルハンドルのリスト内で移動します。システムコール new_file_descriptor = dup(old_file_descriptor)はCでそれを行い、その後、dup2(some_fd,2)いくつかのファイルをstderrとして「アクティブ化」dup2(new_stderr_descriptor,2)し、実際のエラー出力に「再開」します。

複製されたファイル ディスクリプタの 1 つを閉じると、他のファイル ディスクリプタで作業を続けることができますが、ここではソケットを使用すると奇妙なことが起こると予想されます(マンページを掘り下げ、必要に応じてテストケースを書くことに注意してください)。

ああ、ところで、 perlfunc のマンページは、openこれらの複製を行う perl の方法を示しているだけですが、その構文の微妙な点を完全には理解していないことを告白しなければなりません:

open my $oldout, ">&STDOUT"     or die "Can't dup STDOUT: $!";
open OLDERR,     ">&", \*STDERR or die "Can't dup STDERR: $!";
# ...
于 2012-02-06T20:57:18.490 に答える