守护进程中/dev/null

原文链接:http://blog.csdn.net/drdairen/article/details/52586954

有人认为对于后台守护进程做此类重定向操作浪费资源,建议直接关闭0、1、2号句
柄拉倒,这是非常不正确的。假设它们确实被关闭了,则一些普通数据文件句柄将等
于0、1、2。以2号句柄为例,某些库函数失败后会向2号句柄输出错误信息,这将破
坏原有数据。
1、如下代码将stdin、stdout、stderr重定向到/dev/null

   freopen( "/dev/null", "w", stdout );
   freopen( "/dev/null", "w", stderr );
   freopen( "/dev/null", "r", stdin ); 
 
 
  • 1
  • 2
  • 3

第一种方式不是总能达到目的。freopen()并不确保新的文件流描述符一定重用底层
原有文件句柄。假如未能重用,向stderr流输出的标准I/O函数最终输出到/dev/null,
但那些向STDERR_FILENO句柄输出的标准I/O函数就没这么幸运了,可能输出到一些不
可预期的文件中去。换句话说,2号句柄此时不再是标准错误输出了。比如:
write( 2, … ),这样的调用存在安全问题。
2、apue中daemon例子中是如下做的:

   close( 0 );
   close( 1 );
   close( 2 );
   open( "/dev/null", O_RDWR );
   dup( 0 );
   dup( 0 );
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

这种方式可以避免上述问题,然而存在竞争环境问题。

3、现在看下述代码:

    int fd = open( "/dev/null", O_RDWR );
    /*
     * handle failure of open() somehow
     */
    dup2( fd, 0 );
    dup2( fd, 1 );
    dup2( fd, 2 );
    if ( fd > 2 )
    {
        close( fd );
  }
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
与第二种方式相比,这种代码是线程安全的
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值