加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 21:18:08 所属栏目:大数据 来源:网络整理
导读:我有一个Perl脚本,它自己强制和守护进程。它是由cron运行的,所以为了不会在僵尸周围离开,我关闭STDIN,STDOUT和STDERR: open STDIN,'/dev/null' or die "Can't read /dev/null: $!";open STDOUT,'/dev/null' or die "Can't write to /dev/null: $!";open
我有一个Perl脚本,它自己强制和守护进程。它是由cron运行的,所以为了不会在僵尸周围离开,我关闭STDIN,STDOUT和STDERR:
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过去那样呢?

我知道我可以使用“/ dev / tty”,如果我从一个tty运行(但是我从cron运行,并且依赖于别的stdout)。我也读了一些技巧,你可以把STDOUT放在一边打开SAVEOUT,“>& STDOUT”,但只是这个拷贝的行为并不能解决原本的僵尸离开的问题。

我想看看是否有一些像开放式STDOUT这样的魔法,“| – ”(我不知道这样)打开STDOUT应该被打开的方式。

解决方法

如果仍然有用,可以考虑两件事:

>您可以在子进程中关闭STDOUT / STDERR / STDIN(即if(!fork()),这样允许父进程仍然使用它们,因为它们仍然在那里打开。
>我想你可以使用更简单的关闭(STDOUT)而不是打开它到/ dev / null。

例如:

if (!fork()) {
    close(STDIN) or die "Can't close STDIN: $!n";
    close(STDOUT) or die "Can't close STDOUT: $!n";
    close(STDERR) or die "Can't close STDERR: $!n";
    do_some_fork_stuff();
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读