学习目标:
Linux内核中存在一系列具备预定功能的函数,操作系统将这些函数功能抽象为一组被称为
系统调用的接口提供给应用程序使用,open(),read(),write()、Iscek(), close()等都是系统
调用中与 I/O 操作相关的接口。下面对系统调用级的 I/O 接口函数进行讲解。
首先然我们来回顾一下c语言的文件操作:
学习内容:
文件操作函数:
open()函数:
格式:int open(const char *pathname , int flags[,mode_t mode]);
功能:该函数存在于系统函数库fcntl.h中,是打开或者创建一个文件
参数:pathname:要打开文件的文件路径名;
flags:文件的访问模式,一般使用一组宏表示;
mode:可选属性,给定权限。
read()函数:
格式:ssize_t read(int fd,void * buf,size_t count);
功能:已打开的设备或者文件中读取数据从
参数:fd:fd是open一个文件后赋的值,
buf:文件中的内容按指定大小存在buf中后续进行输出
count:最大读取的长度
write()函数:
格式:ssize_t write(int fd,const void * buf,size_t count);
功能:已打开的设备或者文件中读取数据从
参数:fd:fd是open一个文件后赋的值。
buf:文件中的内容按指定大小存在buf中后续进行输出
count:最大读取的长度
lseek()函数:
格式:off_t lseek(int fd, off_t offset, int whence);
功能:作为一个偏移量,表示当前文件的读写位置
参数:fd:fd是open一个文件后赋的值,
offset:当前偏移量的设置
whence:控制偏移量的方法。
close()函数
打开的文件在操作结束后使用close()释放缓存。
i nt close(int fd);
代码例如:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
int main(){
int Fd = 0;
char tempFileName[20] = "gyp.txt";
//第一部打开文件
Fd = open(tempFileName,O_RDWR|O_EXCL|O_TRUNC);
if(Fd == -1){
perror("file open error.\n");
exit(-1);
}//of if
//第二部写入文件
int tempLen = 0;
char tempBuf[100] = {0};
scanf("%s", tempBuf);
tempLen = strlen(tempBuf);
write(Fd, tempBuf, tempLen);
close(Fd);
//第三步读取文件
Fd = open(tempFileName, O_RDONLY);
if(Fd == -1){
perror("file open error.\n");
exit(-1);
}//of if
off_t tempFileSize = 0;
tempFileSize = lseek(Fd, 0, SEEK_END);
lseek(Fd, 0, SEEK_SET);
while(lseek(Fd, 0, SEEK_CUR)!= tempFileSize){
read(Fd, tempBuf, 1024);
printf("%s\n", tempBuf);
}//of while
close(Fd);
return 0;
}//of main
学习时间:
2022年5月2日
学习心得
Linux 系统调用中的文件 I/o又被称为无缓存 I/o。除此之外,在程序编写时我们还
由运行结果可知、read()成功读取指定文件中的数据。
可以使用一种有缓存的 I/O。有缓存的 I/O 又被称为标准 I/0,是符合 ANSI C标准的 1/0
处理。标准 I/O 有两个优点,一是执行系统调用 read()和 write()的次数较少;二是不依赖
系统内核,可移植性强。