linux文件描述符问题

ang868 2013-11-24 10:51:14

int main()
{
int fd1, fd2;

fd1 = open("foo.txt", O_RDONLY, 0);
printf("%d\n", fd1);
close(fd1);

fd2 = open("baz.txt", O_RDONLY, 0);
printf("%d\n", fd2);

return 0;
}


代码如上,此程序输出结果为:
4
4

而不是想象中的3 3 ,因为在进程生命周期开始时,打开的描述符号赋给了stdin(0)、stdout(1)、stderr(2),那么我接下来打开的文件描述符返回的返回的应该是3,为什么是4呢?
...全文
168 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ang868 2013-11-27
  • 打赏
  • 举报
回复
引用 7 楼 letian0805 的回复:
那是因为你用了动态链接库。比如libc.so.6 程序打开动态链接库自然要占用文件描述符了。你可以用strace启动程序看日志
好的,我试试。
bblueske 2013-11-24
  • 打赏
  • 举报
回复
用lsof查看一下你的程序打开了哪些fd,如果没有就是open实现的问题了。
ang868 2013-11-24
  • 打赏
  • 举报
回复
引用 3 楼 JoeBlackzqq 的回复:
如果非要追根问底,去看下open的内核实现吧,那才是根本!
不是我固执于什么,只是一个linux进程初始化只会初始化0,1,2三个文件符,我也非常确定我没用其他的打开操作,第一个操作被我close掉了,所以被释放,后来的fd2才会和之前的fd1相同,问题是描述符3跑哪去了?!
JoeBlackzqq 2013-11-24
  • 打赏
  • 举报
回复
如果非要追根问底,去看下open的内核实现吧,那才是根本!
JoeBlackzqq 2013-11-24
  • 打赏
  • 举报
回复
以你这思维逻辑,第一次运行你这个程序是3,3 (假如你这处程序不退出) 再运行你这个程序,还是3,3? 那么再运行这个程序,还是3,3 ? 那大家直接用3,3就好了,还要接受返回值干吗?
JoeBlackzqq 2013-11-24
  • 打赏
  • 举报
回复
有意义吗? 你确定没有其他程序用open()???
初一公主奶爸 2013-11-24
  • 打赏
  • 举报
回复
那是因为你用了动态链接库。比如libc.so.6 程序打开动态链接库自然要占用文件描述符了。你可以用strace启动程序看日志
qiyu1988 2013-11-24
  • 打赏
  • 举报
回复
return 之前写个语句卡住,然后看下这个程序的/proc信息,看看fd3干嘛去了。 open之后最好判断下返回值

23,131

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧