首先了解“文件描述符”:对于内核而言,所有打开的文件都是通过文件描述符引用。它是一个非负整数,它的范围是0~OPEN_MAX。
Linux系统下大多数文件I/O操作只要5个函数就可以:
- open
- read
- write
- lseek
- close
- 调用函数open可以打开或创建一个文件。
#include<fcntl.h>
int open(const char *filename,int flag,/*mode_t mode*/);
这里的第三个参数只在创建文件时才有。关于flag的取值,可以man一下。
如果成功返回文件描述符,否则返回-1。
- 调用creat可以创建一个新文件。
#include<fcntl.h>
int creat(const char *filename,int flag,mode_t mode);
其实它就等效于open(filename,O_WRONLY | O_CREAT | O_TRUNC,mode);
如果成功返回为文件只写打开的文件描述符,否则返回-1。
- 调用close函数关闭一个打开的文件。
#include<unistd.h>
int close(int file);
如果成功返回0,否则返回-1。
- 关于函数lseek
每打开一个文件都有一个于之对应的“当前文件偏移量”,系统默认打开一个文件的偏移量为0。函数lseek可以设置这个偏移量。
#include<unistd.h>
off_t lseek(int file,off_t offset,int whence);
参数offseet的解释与whence有关:
若whence是SEEK_SET,则将文件的偏移量设置为据文件开始处offset个字节处。
若whence是SEEK_CUR,则将文件的偏移量设置为当前值加offset。
若whence是SEEK_END,则将文件的偏移量设置为文件长度加offset。
如果函数成功执行,返回新的偏移量,否则返回-1,错误信息可以查看errno。
- 调用read函数从打开的文件中读取数据。
#include<unistd.h>
ssize_t read(int file,void *buf,size_t nbytes);
如果调用成功,返回读到的字节数,如已读到文件尾则返回0,出错就返回-1。
- 调用write函数向打开的文件写数据。
#include<unistd.h>
ssize_t write(int file,const char *buf,size_t nbytes);
若调用成功返回已写字节数,失败返回-1,通常返回值如果与nbytes相同,则表示出错。
转载请注明:爱开源 » Linux下不带缓冲的I/O操作函数1