一、系统调用
系统调用实际上是操作系统(内核)提供的供用户使用的接口函数。
二、标准IO函数和文件IO函数的关系
标准IO是C库内定义的函数,是凌驾于系统之上的,适用于任何的操作系统;文件IO是由Linux系统提供的,
只能在linux系统中使用,而不可以在其它操作系统中使用。标准IO函数可以调用文件IO函数。
三、文件描述符
文件描述符是Linux内核用来标识一个打开的文件的符号,是一个非负整数;文件流指针是内存用来标识
一个打开的文件的符号。
FILE*文件流指针 | 文件描述符 | 文件描述符符号常量 | |
---|---|---|---|
标准输入 | stdin | 0 | STDIN_FILENO |
标准输出 | stdout | 1 | STDOUT_FILENO |
标准出错 | strerr | 2 | STDERR_FILENO |
四、文件IO函数
1、open函数
函数原型:int open(const char* filename, int flags);
int open(const char* filename, int flags, int mode);
函数功能:以flag指定的方式打开文件filename,获得对应文件的文件描述符,该描述符有返回值带回。
参数:filename 目标文件,是一个字符串常量,可以包含文件的路径
flags 打开文件的访问权限。
O_RDONLY 只读的方式
O_WRONLY 只写的方式
O_RDWR 读写的方式
O_APPEND 追加
O_CREAT 创建(文件不存在时进行创建)
以上的访问权限还可以使用“|”进行连接,例如:
O_WRONLY | O_CREAT 以只写的方式打开文件,文件不存在则创建
O_RDWR | O_CREAT 以读写的方式打开文件,文件不存在则创建
mode 对“新建”的文件指定权限,只有当文件不存在而且第二个参数中有O_CREAT时,该参数才会
使用。实际创建的权限应该与文件权限掩码umask进行运算得到实际的文件权限,运算规则
如下:
实际文件权限 = 给与的权限&(~umask);
返回值:文件打开成功,返回当前未使用的最小的文件描述符;失败则返回-1,并设置errno。
用户权限:
读权限 4
写权限 2
执行权限 1
2、close函数
函数原型:int close(int fd);
函数功能:关闭文件描述符fd相对性的文件。
3、read函数
函数原型:size_t read(int fd, void *buf, size_t count);
函数功能:“期望”从文件描述符fd相关联的文件中读取count个字节的数据存放在缓冲区buf中。
参数:fd 文件描述符
buf 存放读取到的数据的缓冲区首地址
count “期望”读取的字节数
返回值:> 0 表示成功读到的字节数
=0 表示读取到了文件的尾部
-1 读取失败,返回-1,并设置errno
1、read函数说明:
(1)读取某个文件的方式
while(ret > 0){
读取文件;
}
分析:当读取到文件的尾部时ret = 0;当读取文件失败ret == -1;因此读取某个文件的条件是ret > 0
(2)read读取文件至少循环两次:
首先,把文件中的所有数据全部读取完毕,返回读取到的字节数;其次,从文件尾部开始读取,读到了文件
末尾,返回0。
4、write函数
函数原型:size_t write(int fd, const void *buf, size_t count);
功能:“期望”将缓冲区buf中存放的数据中的count个字节写入到与文件描述符fd相关联的文件中。
参数:fd 文件描述符
buf 数据存放的缓冲区
count “期望”向文件中写入的字节数目,一般count = strlen(buf),有效写入。
返回值:成功,返回实际写入到文件中的字节数;失败,返回-1,并设置errno。
例:通过文件IO实现文件的拷贝工作。
5、lseek函数
打开一个文件时,除非指定O_APPEND选项,否则该偏移量被默认设置为0。
函数原型:off_t lseek(int fd, off_t offset, int whence);
函数功能:打开fd指定的文件时,设置当前文件的读写位置。
参数:fd 文件描述符
offset 相对于基准的相对偏移大小
whence 相对偏移量的起点。
SEEK_SET 以文件开头为相对偏移量的起点
SEEK_CUR 以当前文件的读写位置为相对偏移量的起点
SEEK_END 以文件的结尾为相对偏移量的起点
返回值:成功设置,则返回文件的当前读写位置(即文件当前读写位置相对于文件开头的偏移量);设置失败
则放回-1。
获取文件的长度:
int length = lseek(fd, 0, SEEK_END);
五、标准IO和文件IO的区别
1、函数的来源不同:标准IO来自于标准C库;文件IO来自于Linux操作系统。
2、标准IO具有缓冲机制,而文件IO没有缓冲机制。
3、标准IO通过流指针来进行文件的操作;而文件IO通过文件描述符来进行文件的操作。
六、标准IO和文件IO的使用场合不同
标准IO主要用于编写应用层程序,适用于Linux上层应用开发;文件IO主要用于进行Linux底层开发,用于编写
内核和驱动程序。