<code>
#include <stdio.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
printf("%d\n",stdin->_fileno);
printf("%d\n",stdout->_fileno);
printf("%d\n",stderr->_fileno);
while(1)
{
FILE *pf = tmpfile();
if(NULL == pf)
{
perror("tmpfile");//无缓冲
break;
}
printf("%d ",pf->_fileno);//行缓冲
}
putchar(10);// 遇到 '\n' 刷新行缓冲
printf("%d\n",getdtablesize());//直接获取文件描述符总量
return 0;
}
结果
函数
tmpfile
功能:函数以二进制读/写(w+b)方式打开唯一的临时文件。当文件被关闭或程序终止时,该文件将被自动删除。
头文件:
#include <stdio.h>
原型:
FILE *tmpfile(void);
返回值:
成功,返回一个流指针。
失败,返回NULL。设置errno值。
getdtablesize
功能:返回进程可以打开的最大文件数,比文件描述符的最大值多一个。
头文件:
#include <unistd.h>
原型:
int getdtablesize(void);
返回值:
当前进程能打开的文件描述符总量
fileno
功能:返回一个流结构体中存储的文件描述符值
头文件:
#include <stdio.h>
原型:
int fileno(FILE *stream);
参数:
流指针
返回值:
流指针指向结构体中的文件描述符值
总结
- 文件描述符:文件IO对文件读写的直接操作句柄;在标准IO中,文件描述符被封装进FILE结构体中,经过一个(流指针指向的)缓冲区间接操作
- 一个程序最多可以同时打开1024个文件 [0,1023]
- 行缓冲操作对象:stdin、stdout
- 行缓冲大小:1K = 1024byte
刷新行缓冲的7种方式
- 缓冲区满时自动刷新
- 用fflush(FILE *stream)函数强制刷新缓冲区
- 用函数fclose(FILE *stream)关闭对应的流指针时刷新
- 程序正常退出时刷新
- 调用exit(int status)函数退出进程时刷新
- 遇到 '\n' 字符时刷新
- 遇到输入函数(scanf、fgets、fgetc)时刷新
- stderr无缓冲,直接输出,上图红框圈出。图中错误信息前的数据能刷出来是因为行缓冲区满了输出
底层
本文链接:https://shengto.top/c/fileno.html
转载时须注明出处及本声明