UNIX/O
在UNIX系统中有一个说法,一切皆文件。所有的I/O设备,如网络、磁盘都被模型化为文件,而所有的输入和输出都被当做对相应文件的读和写来执行。这种将设备映射为文件的方式,允许UNIX内核引出一个简单、低级的应用接口,称为UNIX I/O,这使得所有的输入和输出都能以一种统一且一致的方式来执行。
(1)打开文件 打开文件操作完成以后才能对文件进行一些列的操作,打开完成过以后会返回一个文件描述符,它在后续对此文件的所有操作中标识这个文件,内核记录有关这个打开文件的所有信息。
(2)改变当前的文件位置。
(3)读写文件
(4)关闭文件 应用完成了对文件的访问之后,就通知内核关闭这个文件,内核释放文件打开时创建的数据结构,并将这个描述符恢复到可用的描述符池中。进程终止,内核也会关闭所有打开的文件并释放他们的存储器资源。
打开和关闭文件
打开文件
进程通过open函数来打开一个已经存在的文件或者创建一个新文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(char* filename,int flags, mode_t mode);
open函数将 filename 转换为一个文件描述符
O_RDONLY:只读
O_WRONLY: 只写
O_RDWR: 可读可写
O_CREAT: 文件不存在,就创建一个它的截断的空文件。(就是创建一个新空白文件)
O_TRUNC: 如果文件已经存在,就截断它。(清空它) O_APPEND: 在每次写操作前,设置文件位置到文件结尾处。
关闭文件
调用close()函数
#include <unistd.h>
int close(int fd);
读和写文件
#include <unistd.h>
ssize_t read(int fd,void *buf,size_t n);
ssize_t write(int fd,const void *buf,size_t n);
返回值:
成功返回实际读到的字节数
返回0,表示什么都没有
失败返回-1,同时error被设置
I/O重定向
所谓的I/O重定向也就是让已创建的fd指向其他文件。
实现重定向:dup函数和dup2函数
#include <unistd.h>
int dup(int oldfd);
int dup2(int oldfd,int newfd);
当调用dup函数时,内核在进程中创建一个新的文件描述符,此描述符是当前可用文件描述符的最小数值,这个文件描述符指向oldfd所拥有的文件表项。
dup2和dup的区别就是可以用newfd参数指定新描述符的数值,如果newfd已经打开,则先将其关闭。如果newfd等于oldfd,则dup2返回newfd, 而不关闭它。dup2函数返回的新文件描述符同样与参数oldfd共享同一文件表项。
系统级I/O小结
Input输入,Output输出。Linux shell提供了I/O重定向操作符,允许用户将磁盘文件和标准输人输出联系起来。较高级的I/O都是基于Unix I/O函数来实现的。