首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何重新初始化Perl的STDIN/STDOUT/STDERR?

如何重新初始化Perl的STDIN/STDOUT/STDERR?
EN

Stack Overflow用户
提问于 2009-08-28 18:29:39
回答 2查看 17K关注 0票数 17

我有一个Perl脚本,它自己派生和守护进程。它是由cron运行的,所以为了不留下僵尸,我关闭了STDIN、STDOUT和STDERR:

代码语言:javascript
复制
open STDIN, '/dev/null'   or die "Can't read /dev/null: $!";
open STDOUT, '>>/dev/null' or die "Can't write to /dev/null: $!";
open STDERR, '>>/dev/null' or die "Can't write to /dev/null: $!";
if (!fork()) {
  do_some_fork_stuff();
  }

我的问题是:我希望在这一点之后至少恢复STDOUT (恢复另外2个会很好)。但是,我需要使用什么魔法符号来重新打开STDOUT,就像以前的STDOUT一样?

我知道如果我是从tty运行的,我可以使用"/dev/tty“(但我是从cron运行的,并且在其他地方依赖于stdout )。我也读过一些技巧,你可以用open SAVEOUT,">&STDOUT"把STDOUT放在一边,但是仅仅复制这个副本并不能解决留下僵尸的原始问题。

我想看看是否有像open STDOUT,"|-"一样的魔力(我知道不是这样),可以按照应该打开的方式打开STDOUT。

EN

回答 2

Stack Overflow用户

发布于 2009-11-12 15:49:51

文件描述符的副本

代码语言:javascript
复制
open(CPERR, ">&STDERR");

将stderr重定向到警告文件

代码语言:javascript
复制
open(STDERR, ">>xyz.log") || die "Error stderr: $!";

关闭重定向的文件句柄

代码语言:javascript
复制
close(STDERR) || die "Can't close STDERR: $!";

恢复stdout和stderr

代码语言:javascript
复制
open(STDERR, ">&CPERR") || die "Can't restore stderr: $!";

#我希望这对你有用。

#-Hariprasad AJ

票数 15
EN

Stack Overflow用户

发布于 2009-08-28 19:43:01

一旦关闭,就再也找不回来了。

为什么你又需要STDOUT了?将消息写入控制台?使用/dev/console,或者使用Sys::Syslog写入syslog。

不过老实说,另一个答案是正确的。如果您想要稍后重新打开旧的标准输出(克隆到新的fd),则必须将其保存。它确实解决了“僵尸”问题,因为您可以将fd0(和1& 2)重定向到/dev/null。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1348639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档