首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取stdout c的文件描述符

获取stdout c的文件描述符
EN

Stack Overflow用户
提问于 2019-12-05 04:16:12
回答 2查看 4.1K关注 0票数 1

默认情况下,stdin、stdout、stderr文件描述符为0、1和2。但是,在我通过fd = open(foo, 0)打开一个文件之后,我发现fd现在是1.1,用于新的文件描述符。现在什么是stdout文件描述符?或者是关闭了我需要重新打开它?如果是,怎么做?是否有办法保持0,1,2文件描述符和使用从3?

代码语言:javascript
复制
/* readslow from the book with my "improve": the unix programming environment */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define SIZE 512
int main (int argc, char *argv[])
{
    char buf[SIZE];
    int n, fd;
    int t = 10;

    if ((argc > 1) && (fd = open(argv[1], 0) == -1)) {error("can't open %s", argv[1]);}
    fprintf(stderr, "%d", fd);

    for (;;) {
        while ((n = read(fd, buf, sizeof buf)) > 0)
           write(1, buf, n);
        sleep(t);
    }
}

fprintf(stderr, "%d", fd)会给我1。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-05 04:53:04

您的代码包含以下片段:

代码语言:javascript
复制
if (argc > 1 && (fd = open(argv[1], 0) == -1))

fd中的结果就像您在括号内写了比较一样:

代码语言:javascript
复制
if (argc > 1 && (fd = (open(argv[1], 0) == -1)))

因此分配给fd的结果是正确的1,因为open()返回的值确实是-1。您应该在作业周围加上括号:

代码语言:javascript
复制
if (argc > 1 && (fd = open(argv[1], 0)) == -1)
票数 3
EN

Stack Overflow用户

发布于 2019-12-05 04:24:41

当这个答案被合成的时候,问题中没有代码。我接受了OP的说法,即open返回的文件描述符是1__,但由于错误的paren,结果证明这是不正确的。

我发现

现在的fd是1.1,用于新的文件描述符。

唯一的办法是,如果你关闭fd 1。

现在什么是stdout文件描述符?

fileno(stdout)将给出与句柄相关联的fd

是否有一种方法来保持0,1,2文件描述符并使用从3?

如果您不关闭fd 0,1和2,它们将不会被重用。open使用编号最低的未使用的文件描述符.

如果您希望断开fd 0、1或2,请不要关闭它们。这会引起各种各样的问题。将它们重新打开到/dev/null

还是关闭了我需要重新打开它?如果是,怎么做?

您可以使用dup2使fd成为另一个别名。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59188184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档