繁体   English   中英

Linux C:未使用的文件描述符会发生什么?

[英]Linux C: what happens to unused file descriptors?

(最近没有照顾我的接受道歉 - 我会在得到一些时间后立即这样做;只是想现在问这个问题它发生了)

考虑以下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)?

非常感谢任何答案,
干杯!

我的问题是 - 那些cccccc字节发生了什么?

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

你似乎也有一个可疑的持久性概念,“字节”仍然存在于编译器从头开始的字符串文字中。 write副本write流。

詹斯是对的。 如果你在两种情况下在strace下运行你的程序,你会看到当你重定向时,写入工作 - 因为shell在你的可执行文件分叉之前代表你调用了pipe()。

当你在没有重定向的情况下查看strace时:

write(3, "aaaaaa\n", 7)                 = -1 EBADF (Bad file descriptor)
write(2, "bbbbbb\n", 7bbbbbb)                 = 7
write(1, "cccccc\n", 7cccccc)                 = 7

这提醒我们最佳实践 - 始终检查您的返回值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM