【发布时间】:2014-07-22 10:13:05
【问题描述】:
root@C6903:/ # ls -l /proc/327/fd/
lrwx------ root root 1970-02-11 01:40 0 -> /dev/null
lrwx------ root root 1970-02-11 01:40 1 -> /dev/null
lrwx------ root root 1970-02-11 01:40 2 -> /dev/null
如我所见,all(0, 1, 2) 都指向 /dev/null。为什么?它们在内部有何不同?
在我的情况下(Coredump 环境),fd 的列表是这样的。
root@C6903:/ # ls -l /proc/5987/fd/
lr-x------ root root 1970-02-11 01:34 0 -> pipe:[31608]
所以 stdout 和 stderr 文件不存在。在这种情况下,如果我给出printf(),我将面临未定义的行为(其他打开的文件被覆盖)。为了解决这个问题,
我正在做如下的事情:
int check_fd(int fd)
{
return (fcntl(fd, F_GETFD) != -1);
}
...
if (!check_fd(STDOUT_FILENO))
fopen("/dev/null", "w");
if (!check_fd(STDERR_FILENO))
fopen("/dev/null", "w");
这运作良好。但我害怕如果我做错了什么。如果我必须打开它们,如何区分 stdout 和 stderr?
【问题讨论】:
-
man freopen。简单地调用 fopen 可能会打开一个以 1 或 2 作为底层文件描述符的文件,但这并不能满足您的要求。
标签: linux file unix operating-system