Linux C flie操作: open write read lseek close函数分析

时间:2021-12-26 08:34:21

函数类型:open、 write、 read、 lseek、 close函数属于文件的系统调用。

包含有文件:<sys/stat.h>,<sys/types.h>,<fcntl.h>

文件描述符:实质就是一个整数,当做是文件的ID,在系统中唯一标识文件。对文件read、write、lseek、close操作时就会用到文件描述符。系统开始运行时,一般会有三个已经打开的文件描述符:

  • 0:标准输入
  • 1:标准输出
  • 2:标准错误

1,open函数

Linux中open的函数原型有两个:

int open(const char *path, int oflags);

int open(const char *path, int oflags, mode_t mode );

参数说明。

@path:准备打开的文件或设备名字。如:path="/home/work/text.txt"

@oflags:指出要打开文件的访问模式,三种访问模式如下:

          O_RDONLY: 只读方式打开文件

          O_WRONLY: 只写方式打开文件

          O_RDWR: 读写方式打开文件

注意:

         1,O_RDONLY、O_WRONLY、O_RDWR三个标志只能使用任意的一个。

         2,open调用还可以在oflags参数中包括下列可选模式进行组合(用按位或"|"操作),部分可选模式如下:

              O_APPEND: 以追加的方式打开文件

              O_CREAT  创建一个文件

              O_EXCL如果使用了O_CREAT而且文件已经存在,就会发生一个错误

              O_NOBLOCK 以非阻塞的方式打开一个文件

              O_TRUNC  如果文件已经存在,则删除文件的内容

@mode:如果flags中使用了O_CREAT标志,则调用open函数的时候不仅需要加上打开文件的模式(oflags),还需要设置文件的用户权限(mode)。

常见的mode如下:

             S_IRWXU  用户可以读、写、执行

             S_IRUSR  用户可以读

             S_IWUSR   用户可以写

             S_IXUSR   用户可以执行

             S_IRWXG   组可以读、写、执行

             S_IRGRP  组可以读

             S_IWGRP   组可以写

             S_IXGRP   组可以执行

             S_IRWXO   其他用户可以读、写、执行

             S_IROTH   其他用户可以读

             S_IWOTH  其他用户可以写

             S_IXOTH  其他用户可以执行

             S_ISUID  设置用户执行ID

             S_ISGID  设置组的执行ID

注意:1,mode也可以用数字表示,和chmod 777 /usr/a.out用法类似。从最高位开始分别对应的权限是:当前用户权限,组权限,其他用户权限

             2,每一位是一个八进制数,{r,w,x}=第一位表示读权限,第二位表示写权限,第三位表示可执行权限。有权限则设为1,没有则设为0.建议使用数字表示权限,用起来方便简洁。

eg,

      int fd;

      fd = open("../test/myfile", O_RDWR | O_CREAT, 0644); //mode也可以用S_IRWXU| S_IRGRP| S_IROTH表示

      or

      fd=open(/home/test/text.c,O_RDWR);


@返回值:成功返回的fd>0,失败返回的fd<0(fd=-1).

2,read函数

Linux中read的函数原型:

size_t read(int fildes, void *buf, size_t nbytes);

参数说明:

fildes:文件描述符,标识要读取的文件。如果为0,则从标准输入读数据。类似于scanf()的功能。

*buf:缓冲区,用来存储读入的数据。

nbytes:要读取的字符数。

返回值:size_t返回成功读取的字符数,它可能会小于请求的字节数。


3,write 函数

Linux 中write()的函数原型:

size_t write(int fildes, const void *buf, size_t nbytes);

参数说明:

fildes:文件描述符,标识了要写入的目标文件。例如:fildes的值为1,就像标准输出写数据,也就是在显示屏上显示数据;如果为 2 ,则想标注错误写数据。

*buf:待写入的文件,是一个字符串指针。

nbytes:要写入的字符数。

函数返回值:size_t  返回成功写入文件的字符数。需要指出的是,write可能会报告说他写入的字节比你所要求的少。这并不一定是个错误。在程序中,你需要检查error已发现错误,然后再次调用write写入剩余的数据。

4,lseek函数

Linux 中lseek()的函数原型:

off_t lseek(int fd, off_t offset, int whence);

fd是打开的文件描述符,offset是与参考偏移的位置,whence是文件参考的位置,它一共有三个位置,

SEEK_SET 文件开始,如果使用此偏移,那么文件定位到offset的位置

SEEK_CUR 文件读写指针的当前位置

SEEK_END 文件结尾

lseek返回值是文件读写指针移动之后的位置,-1表示失败

a,取得文件当前偏移位置可以如下: f_offset = lseek(fd, 0, SEEK_CUR);

b,文件大小可以通过下面: f_len = lseek(fd, 0, SEEK_END);

c,使用lseek函数移动好读写指针之后,使用read,write即可往文件里面读写数据。

5,close函数

Linux 中close()的函数原型:

int close(int fildes);

作用:close系统调用用于“关闭”一个文件,close调用终止一个文件描述符fildes以其文件之间的关联。文件描述符被释放,并能够重新使用。

返回值:close成功返回1,出错返回-1.


参考:1http://www.cnblogs.com/yanlingyin/archive/2012/08/04/2617209.html

            2,http://blog.csdn.net/yao_guet/article/details/6460900