gpt4 book ai didi

c - Linux C : what happens to unused file descriptors?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:40:22 24 4
gpt4 key购买 nike

(很抱歉最近没有处理我的 accepts - 我一有时间就会这样做;现在只是想问这个问题)

考虑以下 C 程序:

int main(void) {
write(3, "aaaaaa\n", 7);
write(2, "bbbbbb\n", 7);
write(1, "cccccc\n", 7);
return 0;
}

我从 bash shell 构建并运行它,如下所示:

$ gcc -o wtest wtest.c
$ ./wtest 3>/dev/stdout
aaaaaa
bbbbbb
cccccc

在我看来,在这种情况下,由于 fd 3 的 shell 重定向到 stdout,该文件描述符现在被“使用”(不确定“打开”,因为有没有打开文件,至少在 C 代码中是这样) - 所以我们按预期将 cccccc 字符串输出到终端。

如果我不使用重定向,那么输出是这样的:

$ ./wtest 
aaaaaa
bbbbbb

现在 fd 3 没有被重定向——所以 cccccc 字符串没有输出,同样如预期的那样。

我的问题是 - 那些 cccccc 字节发生了什么?它们是否以同样的方式消失,就好像我将 fd 3 重定向到 /dev/null? (如:

$ ./wtest 3>/dev/null

)

此外,假设在特定情况下我想“隐藏”fd 3 输出:重定向“3>/dev/null”与重定向之间是否存在性能差异?根本不在 shell 中寻址 fd 3(就流数据而言;也就是说,如果 fd 3 输出一个非常长的字节流,那么在 "3>/dev/null 中写入的每个字节都会有指令惩罚"的情况,而不是不解决 fd 3)?

非常感谢您的回答,
干杯!

最佳答案

My question is - what happened to those cccccc bytes?

没什么。你没有捕获到 write 的返回码,它应该告诉你有错误,errno 应该告诉你错误是什么

您似乎对持久性的概念也有疑问,“字节”仍然位于编译器从一开始就放置它们的字符串文字中。 write 将字节复制到流中。

关于c - Linux C : what happens to unused file descriptors?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13166717/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com