close stdin/stdout 引发的BUG

close stdin/stdout 引发的BUG

大概是去年初的时候的一件事,客户说有一个生产系统上的程序行为不正常,总是在日志里出现一些乱糟糟的信息,
仔细交流之后,客户说只在配置文件是某种状态时才会出现。看了一下,目标就锁定在那个调用的close函数上了
后来想了一想,猛然想起来了:“ open 一个文件时,它的文件描述符总是最小的可用值"
代码示例如下:


[of@lbaby workspace]$ cat tclose.c
#include <stdio.h>
#include <unistd.h>
int main(void)
{
        close(0);
        close(1);
        close(2);

        fopen("a", "w");
        fopen("b", "w");

        printf("hello world/n");
}
[of@lbaby workspace]$ cc -o tclose tclose.c
[of@lbaby workspace]$ ./tclose
[of@lbaby workspace]$ cat b
hello world
[of@lbaby workspace]$
你没看错,printf 没有正常输出,而是输出到文件b中去了
这是因为 close了0(stdin),1(stdout),2(stderr) 以后,
fopen 的 a ,b 的文件描述符分别为0,1,printf的最终调用其实是对文件描述符1的write调用
因此,写文件时就写到b 中去了。

明白了产生原因之后,就容易改动了:把程序中所有涉及到的调试输出(坏毛病啊,发布版里有调试输出,不是我写的代码)删除,算是暂时解决了这个问题。

教训:不要轻易关闭 stdin/stdout/stderr,如果非要关闭,将0, 1 , 2 dup2 到/dev/null之后再进行

云风的blog 也记录了相关的问题 有兴趣的可以看 这里

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值