linux - 理解标准输出、标准错误和标准输入

标签 linux file unix operating-system

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,如何区分它们?

最佳答案

如果 stdout 和 stderr 已关闭并且您想重新打开它们,请尝试:

freopen( "/dev/null", "w", stdout );

关于linux - 理解标准输出、标准错误和标准输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23992074/

相关文章:

css - 有没有办法托管 bitbucket 存储库中的 css 文件

c - fscanf c 编程奇怪的错误

linux - 这个shell脚本有什么作用?

unix - 可以从它外面派生一个进程吗?

python - celery worker raise sock setsockopt TCP_SYNCNT [Errno 22] 参数无效

linux - 在树莓派上找不到 libdb

linux - 将 http 非 www 转移到 http www,并将 https 非 www 转移到 https www

linux - 有没有办法链式加载,例如Linux 中的 Windows

python - 如何在涉及写入文件或 .gzip 文件的多生产者-消费者流程中正确使用 asyncio?

bash - 如何在 unix 终端的唯一顺序列表(每行一个)中找到丢失的整数?