繁体   English   中英

如何在Perl中打开()和关闭()STDERR?

[英]How can I open() and close() STDERR in Perl?

问候 ,

我可以使用perl关闭STDERR;

close(STDERR)

在执行一些逻辑后,我想再次打开它。 我该怎么做?

我试过了

open(STDERR,">&STDERR");

并没有奏效。

提前致谢。

你为什么要关闭STDERR?

你可以把它放在一边......

open(FOO, ">/dev/null"); # or ">nul" on Windows
*TEMP = *STDERR;
*STDERR = *FOO;
... then
*STDERR = *TEMP;

首先复制它,然后复制dup以重新打开它(错误检查留给读者的练习,虽然在STDERR不可用时处理错误可能是一种挫败的练习):

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

请注意,当您关闭STDERR时,您将释放文件描述符2; 如果你打开另一个文件并且它获得了文件描述符2,那么你正在使用的任何非Perl库都可能认为其他文件是stderr。

STDERR由父进程提供。 它不一定是一些常规文件,所以你最好保持它打开,除非你不打算再写它。 我会避免使用tty shell命令并在这里重新打开/ dev / pts / XX,这真的很棒:这只会让你陷入困境

我想你可能想要做的是阻止一些库在STDERR上产生输出,同时它被设计成这样做。 要做到这一点,您需要保持文件打开,但在文件句柄列表中移动它。 系统调用new_file_descriptor = dup(old_file_descriptor)在C中执行该操作,之后dup2(some_fd,2)将某个文件“激活”为stderr,将dup2(new_stderr_descriptor,2) “恢复”为实际错误输出。

关闭一个dup'd文件描述符应该允许你继续使用另一个文件描述符,虽然我希望在这里使用套接字时会发生奇怪的事情。 (注意,挖掘联机帮助页并根据需要编写测试用例)。

哦,顺便说一句, open的perlfunc手册页只是向你展示了做这些重复的perl方法,虽然我必须承认我并不完全理解那种语法的微妙之处:

open my $oldout, ">&STDOUT"     or die "Can't dup STDOUT: $!";
open OLDERR,     ">&", \*STDERR or die "Can't dup STDERR: $!";
# ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM