linux操作系统io
FILE *stdout 文件流指针
我们写入printf,操作系统调用write函数,write函数再第哦啊用sys_write函数,然后sys_write再调用 底层的设备驱动,调用设备驱动和底层相关,如果要写入网络则调用网卡驱动,如果要显示到显示器上那么就调用显示器 。
虚拟地址空间中有1g是内核区,用来虚拟文件系统,内存管理,进程管理,设备管理的,其中进程管理有一个pcb进程控制块,也就是一个mm_struct结构体,在这个结构体重有一个文件描述符表,从0开始到1023,其中没一个进程都会初始化0,1,2这三个数字来表示标准输入,标准输出,标准错误。
不是说了吗,printf调用write(1,…)函数其中第一个参数1代表的就是标准输出
其次是缓冲区什么时候刷新:手动刷新,fclose()关闭,缓冲区满了,这三种 情况下会刷新缓冲区
文件描述符表
拿这一段代码来解释一下首先main进程创建,然后close关闭1,然后调用open函数打开文件1.log,int fd让1指向了这个文件(open函数特性,打开一个文件,用最小文件描述符指向这个文件),然后printf进行标准输出,如果这个时候关闭了文件的fd那么写入的内容还在缓冲区并未刷新,文件并未写入,当放开fflush(stdout)手动刷新缓冲区,再关闭则内容已写入。
文件io:
open:
- int open(const char *pathname, int flags);
- int open(const char *pathname, int flags, mode_t mode);
失败给返回-1,设置errno
close:
read:
- ssize_t read(int fd, void *buf, size_t count);
- 参数含义:文件描述符,缓冲区,缓冲区大小
- 返回值:失败返回-1,成功返回成功读到的字节数,0代表读到了文件末尾
write:
- ssize_t write(int fd, const void *buf, size_t count);
- 参数含义:文件描述符,缓冲区,缓冲区大小
- 返回值:成功返回写入的字节数,失败返回-1设置erron,0表示未写入