Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 是否将“关闭”替换为“打开”`/dev/null`?_File_Perl_Fork_Stdout_Stderr - Fatal编程技术网

File 是否将“关闭”替换为“打开”`/dev/null`?

File 是否将“关闭”替换为“打开”`/dev/null`?,file,perl,fork,stdout,stderr,File,Perl,Fork,Stdout,Stderr,我们有这样的Perl代码: if (fork==0) { # in child process close STDOUT и STDERR, for the parent process didn't wait a response from the child and finished quickly close(STDOUT); if (!defined fileno(CGI::Carp::SAVEERR)) {close(STDERR)} # TODO learn to cl

我们有这样的Perl代码:

if (fork==0) {
  # in child process close STDOUT и STDERR, for the parent process didn't wait a response from the child and finished quickly
  close(STDOUT); 
  if (!defined fileno(CGI::Carp::SAVEERR)) {close(STDERR)} # TODO learn to close redirected STDERR
  else        { close(CGI::Carp::SAVEERR); } 

  # ...
}
我们在中描述了这个问题-为了解决它,建议我不要关闭STDOUT,而是以“/dev/null”重新打开它

我是否应该在上面的代码中将
close
的所有调用替换为
open
/dev/null
?或者仅
close(标准输出)
close(标准输出)


这个替换是否会打破“父进程没有等待子进程的响应并很快完成”

似乎有一些事情需要澄清

父进程确实需要获取其子进程(
wait
SIGCHLD
上的
waitpid
),如果这就是您所说的“等待子进程的响应”。但是,如果父级先退出,则子级将由
init
重新设置为父级,一切正常。这不受子对象关闭(重新打开)其流的影响

至于“关闭”流,它们应该被重定向(重新打开)到
/dev/null
。例如,请参阅问题中链接的帖子,了解如何关闭流以进行后台监控

最后,似乎
STDERR
。现在是否要关闭或恢复它取决于意图/设计。如果要将
STDERR
发送到的日志以及流本身应该关闭,您应该首先关闭日志,了解模块应该恢复什么
STDERR
(请检查),然后将流重定向到
/dev/null

也许是全部

my $pid = fork // die "Can't fork: $!";  #/

if ($pid == 0) 
{
    open STDOUT, '>', '/dev/null' or die "Can't write to /dev/null: $!";

    if (defined(fileno(CGI::Carp::SAVEERR)) 
    {
        close $fh_log_to_which_STDERR_was_redirected  or die $!;
        close CGI::Carp::SAVEERR                      or die $!;
    }    
    open STDERR, '>', '/dev/null' or die "Can't write to /dev/null: $!";
    ...
}
但是请检查您的
CGI::Carp
处理,因为问题中没有这方面的信息

上下文>代码> For <代码>,但不考虑或启动和管理进程。