C语言默认输入输出流
标准输入:stdin
标准输出:stdout
标准错误:stderr
这三个是C语言默认打开的流
他们的返回类型都是FILE*,fopen返回值类型
fwrite、fread、fopen这些属于C接口,底层会调用系统接口
系统文件IO
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
这里的mode是权限,在创建文件的时候可以给文件设置权限
注意:系统有默认的umask,所以在设置权限时需要加上umask
文件描述符
文件描述符是一个整数,从0开始的整数,Linux进程默认会打开文件描述符为0的标准输入、为1的标准输出、为2的标准错误
文件描述符是什么?
操作系统为了管理文件,需要一个file_struct来描述文件
所以就有一个指针数组来指向file_struct,而文件描述符就是这个数组的下标
重定向
重定向就是在不改变文件描述符的情况下,改变文件描述的信息进而改变文件
int dup2(int oldfd, int newfd);
dup2重定向函数
1、将newfd描述符重定向到oldfd,共同改变oldfd
2、如果重定向前,newfd已经打开,则会关闭
缓冲
调C接口时,先写到C语言的缓冲区(图中三个底层都是调write也就是系统接口)
系统接口,会写到系统的缓冲区中
为什么没有结果?
因为C语言缓冲区数据没有被刷新出来,1号文件关闭
为什么加上'\n'之后就刷新出来了?
遇到'\n'时是行刷新
总结:
1、没有缓冲区直接刷新
2、行缓冲,遇到'\n'直接刷新
3、全缓冲,当缓冲区满了,将缓冲区数据直接刷新
FILE对象是属于用户还是操作系统?
用户,语言层面的东西都属于用户,所以缓冲区也是属于用户