最近在在实验楼上学Linux,做点笔记。上面的课程对于学习linux还不错,有兴趣可以看看。
文件IO:
Linux提供给了用户程序一些接口,用来调用执行相关的功能。大多数Linux文件I\O只需要用到5个函数:open,read,write,lseek和close
文件描述符:
文件描述符是一个非负整数。当打开一个现存文件或创建一个新文件时,内核向进程返回一个文件描述符。当写一个文件时,用open或create返回的文件描述符标识该文件,将其作为参数传送给read或write。
整数0、1、2被代换成符号常数:
STDIN_FILENO(标准输入,默认是键盘)
STDOUT_FILENO(标准输出,默认是屏幕)
STDERR_FILENO(标准错误输出,默认是屏幕)
这些常数都定义在头文件<unistd.h>中,文件描述符的范围是0~OPEN_MAX
1. open
需要包含的头文件:<sys/types.h>,<sys/stat.h>,<fcntl.h>
函数原型:int open(const str *pathname, int oflag, […, mode_t mode])
功能:打开文件 返回值:成功则返回文件描述符,出错返回-1
参数:
pathname:打开或创建文件的绝对路径
oflag:可用来说明此函数的多个选择项
oflag 参数由O_RDONLY(只读打开)、O_WRONLY(只写打开)、O_RDWR(读写打开)中的一个和下列一个或多个常数组成
O_APPEND: 追加到文件尾
O_CREAT: 若文件不存在则创建它。使用此选择项时,需同时说明第三个参数mode,用其说明新闻件的访问权限
O_EXCL: 如果同时指定O_CREAT,而该文件又是存在的,报错;也可以测试一个文件是否存在,不存在则创建。
O_TRUNC: 如果次文件存在,而且为读写或只写成功打开,则将其长度截短为0
O_SYNC: 使每次write都等到物理I\O操作完成
mode:创建新文件的时候用来设置其权限设置
例子:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
if(open("./test.txt", O_RDONLY | O_CREAT | O_EXCL, 0777) == -1)
{
printf("it already exists!");
exit(-1);
}
else
{
printf("creat successfully!");
}
return 0;
}
2. read
需要包含的头文件:<unistd.h>
函数原型:
ssize_t read(int fd, void *bf, size_t count)
功能:
从打开的文件中读取数据。
返回值:
实际读到的字节数;如果读到了文件尾,返回0,出错的话返回-1;ssize_t是系统头文件中用typedef定义的数据类型,相当于signed int。
参数:
fd:要读取的文件的描述符
buf:得到的数据在内存中的位置的首地址
count:期望本次能读取到的最大字节数
3. write
需要包含的头文件:<unistd.h>
函数原型:
ssize_t write(int fd, const void *buf, size_t count)
功能:向打开的文件写数据
返回值:写入成功后返回写入的字节数,出错返回-1
参数:
fd:要写入的文件的描述符
buf:要写入文件的数据在内存中存放位置的首地址
count:期望写入的数据的最大字节数
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
char buf[100];
int num = 0;
if ((num = read(STDIN_FILENO, buf, 10)) == -1) {
printf ("read error");
error(-1);
} else {
// 将键盘输入又输出到屏幕上
write(STDOUT_FILENO, buf, num);
}
return 0;
}
- close
需要包含的头文件:
unistd.h
函数原型:
int close(int filedes)
功能:
关闭一个打开的文件
参数:
需要关闭的文件描述符 - lseek
需要包含的头文件:<sys/types.h> <unistd.h>
函数原型:
off_t lseek(int filesdes, off_t offset, int whence)
功能:
设置文件内存读写位置
返回值:
成功的话返回新的文件位移,出错返回-1
off_t是系统头文件定义的数据类型,相当于signed int
参数:
filesdes:要写入的文件的描述符
whence是SEEK_SET, 那么该文件的位移量设置为据文件开始处offset个字节
whence是SEEK_CUR, 那么该文件的位移量设置为当前值加offset。offset可为正或负
whence是SEEK_END, 那么该文件的位移量设置为文件长度加offset。offset可为正或负