<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);
参数:
    流指针
返回值:
    流指针指向结构体中的文件描述符值

总结

  1. 文件描述符:文件IO对文件读写的直接操作句柄;在标准IO中,文件描述符被封装进FILE结构体中,经过一个(流指针指向的)缓冲区间接操作
  2. 一个程序最多可以同时打开1024个文件 [0,1023]
  3. 行缓冲操作对象:stdin、stdout
  4. 行缓冲大小:1K = 1024byte
  5. 刷新行缓冲的7种方式

    1. 缓冲区满时自动刷新
    2. 用fflush(FILE *stream)函数强制刷新缓冲区
    3. 用函数fclose(FILE *stream)关闭对应的流指针时刷新
    4. 程序正常退出时刷新
    5. 调用exit(int status)函数退出进程时刷新
    6. 遇到 '\n' 字符时刷新
    7. 遇到输入函数(scanf、fgets、fgetc)时刷新
  6. stderr无缓冲,直接输出,上图红框圈出。图中错误信息前的数据能刷出来是因为行缓冲区满了输出

底层

文件描述符在文件IO和标准IO中的表现

Last modification:2021 年 03 月 30 日 20 : 40 : 03