`
isiqi
  • 浏览: 16029658 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Linux基础编程-文件操作open,lseek,read,write,close

阅读更多

Linux基础编程-文件操作open,lseek,read,write,close

Linux上面对文件的操作可以分为两种:1.Linux系统提供的API; 2.C标准的文件操作函数。

前者依赖于Linux系统,后者是标准的C文件操作函数与操作系统无关。

文件操作方式主要是打开,读写和关闭这三种。

在LinuxAPI之中主要是使用open函数,write,read,close。

open有两个原形:

int open(const char *pathname, int flags);

int open(const char *pathname, int flags, mode_t mode);

这三个参数比较容易看出它们的含义,pathname是文件路径,flags打开文件的标志, mode是打开的模式,返回值应该是打开文件的句柄。

flags标志有下面的定义:

O_RDONLY 以只读的方式打开文件

O_WRONLY 以只写的方式打开文件

O_RDWR 以读写的方式打开文件

O_APPEND 以追加的方式打开文件

O_CREAT 创建一个文件

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

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

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

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

如果flags中使用了O_CREAT标志,则调用open函数的时候需要加上打开文件的模式,设置文件的用户权限

int open(const char *pathname, int flags, mode_t mode);

下面是mode可取的一些值,下面都是八进制的值,使用这些值的时候需要包含头文件:sys/types.h,sys/stat.h

S_IRWXU 00700 用户可以读

S_IRUSR 00400 用户可以写

S_IWUSR 00200 用户可以执行

S_IXUSR 00100 用户可以读、写、

S_IRWXG 00070 组可以读

S_IRGRP 00040 组可以写

S_IWGRP 00020 组可以执行

S_IXGRP 00010 组可以读写执行

S_IRWXO 00007 其他人可以读

S_IROTH 00004 其他人可以写

S_IWOTH 00002 其他人可以执行

S_IXOTH 00001 其他人可以读、写

S_ISUID 04000 设置用户执行ID

S_ISGID 02000 设置组的执行ID

呵呵,这个跟chmod命令中的后面的值差不多,个人比较喜欢用数值来代替,

用八进制数据表示为0777等,其中4:读权限,2:写权限,1:可执行权限,0:无权限,每一位的值可以取其中的一位或是它们的组合

从最低位开始分别对应的权限是:其它用户权限,组权限,当前用户权限。

open函数打开一个文件,如果打开成功则返回一个文件描述符,类似于文件句柄吧,这个数值是大于0的,

如果打开文件失败则会返回-1,这时使用strerror(errno)可以返回错误的描述字符串,要使用这个需要包含头文件errno.h

打开文件之后,可以使用lseek函数对文件的读写指针位置定位,lseek原型如下:

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

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

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

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

SEEK_END 文件结尾

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

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

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

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

#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);

ssize_t write(int fd, const void *buf, size_t count);

这两个函数比较容易看懂的了,从打开的文件,读取count个字节的数据到buf缓冲区,或是把buf缓冲区的count个字节写到文件里面去,

如果没有错误,则会返回实际读/写的字节数,如果有错误码,则会返回-1.

记住一种情况,返回的实际读写数目可能跟你要读写的字节数不一致,这个是没有错的,返回0表示读写的字节为0.

当我们对文件操作完成之后,需要关闭打开的文件

int close(int fd);

返回0表示关闭成功,-1表示关闭失败。

一个简单的例子:

分享到:
评论

相关推荐

    linux网络编程-宋敬彬-part3

    第1篇 Linux网络开发基础 第1章 Linux操作系统概述 2 1.1 Linux发展历史 2 1.1.1 Linux的诞生和发展 2 1.1.2 Linux名称的由来 3 1.2 Linux的发展要素 3 1.2.1 UNIX操作系统 4 1.2.2 Minix操作系统 4 ...

    linux网络编程-宋敬彬-part2

    第1篇 Linux网络开发基础 第1章 Linux操作系统概述 2 1.1 Linux发展历史 2 1.1.1 Linux的诞生和发展 2 1.1.2 Linux名称的由来 3 1.2 Linux的发展要素 3 1.2.1 UNIX操作系统 4 1.2.2 Minix操作系统 4 ...

    linux网络编程-宋敬彬-part1

    3.2.2 打开创建文件open()、create()函数 72 3.2.3 关闭文件close()函数 76 3.2.4 读取文件read()函数 77 3.2.5 写文件write()函数 79 3.2.6 文件偏移lseek()函数 80 3.2.7 获得文件状态fstat()函数 83 ...

    电子科技大学linux环境编程作业2——李林——编写带缓存的文件操作类

    需要提供open/read/write/lseek/close等函数的封装函数 该类要提供数据缓存服务。 调用该类的写操作接口时,数据要首先写到缓存,然后再根据策略写到文件中。 调用该类的读操作接口时,该类能根据策略缓存读出的数据...

    linux 文件I/O编程

    这里包含文件操作的一些用法,比如open read write lseek close 还有对文件添加读取锁和写入锁的一些内容

    Linux环境高级编程实验2

    需要提供 open/read/write/lseek/close 等函数的封装函数 该类要提供数据缓存服务。 调用该类的写操作接口时,数据要首先写到缓存,然后再根据策略写到文件 中。 调用该类的读操作接口时,该类能根据策略缓存读出的...

    编写带缓存的文件操作类

    需要提供open/read/write/lseek/close等函数的封装函数 该类要提供数据缓存服务。 调用该类的写操作接口时,数据要首先写到缓存,然后再根据策略写到文件中。 调用该类的读操作接口时,该类能根据策略缓存读出的数据...

    C++实现的Linux Ext2的用户级文件系统.zip

    实现系统调用 creat open read write lseek(seek) close mkdir 及其它 能够将文件写入虚拟磁盘,并可完好无损地取出。 详细介绍参考:https://biyezuopin.blog.csdn.net/article/details/125644551

    FatFs的API函数中文介绍

    f_open - 打开/创建一个文件f_close - 关闭一个文件 f_read - 读文件f_write - 写文件 f_lseek - 移动文件读/写指针 f_truncate - 截断文件 f_sync - 冲洗缓冲数据 Flush Cached Data f_opendir - 打开一个目录 f_...

    基于c++(MINIX1.0)的控制台实现文件管理系统【100010275】

    本项目是基于MINIX1.0 的文件管理... 基于c++的控制台,实现了linux的基本文件操作命令,包括ls,cd,mkdir,rm,vi等等命令,同时提供基本文件接口,包括sys_open,sys_close,sys_read,sys_write,sys_lseek等系统调用。

    linux_C函数库中文手册

    相关函数 readdir, write, fcntl, close, lseek, readlink, fread 头文件 #include 定义函数 ssize_t read(int fd, void * buf, size_t count); 函数说明 read()会把参数fd 所指的文件传送count 个字节到buf 指针所...

    操作系统期末复习资料

    掌握系统I/O库的使用:read/write/open/lseek/close,能分析程序案例 内核文件I/O数据结构,文件打开过程、文件关闭过程 dup和I/O重定向原理(案例分析) 文件逻辑地址、物理地址的概念 文件创建过程 一体化...

    嵌入式Linux应用程序开发详解

    6.3.2 read、write和lseek 170 6.3.3 fcntl 173 6.3.4 select 178 6.4 嵌入式Linux串口应用开发 183 6.4.1 串口概述 183 6.4.2 串口设置详解 184 6.4.3 串口使用详解 191 6.5 标准I/O开发 ...

    Linux 2.6.11内核文件IO系统调用详解

    本文主要讲述的是文件I/O操作的2.6.11内核版本实现,包括了主要的数据结构、宏定义和函数流程。分别讲述open,create,close,read,write,lseek系统调用。

    UNIX环境高级编程_第2版.part2

    UNIX环境高级编程_第2版 ----------------------------------------------------------- 共两个压缩包( UNIX环境高级编程_第2版.part1 UNIX环境高级编程_第2版.part1 ) ------------------------------------------...

    Linux 2.6.17.9内核文件系统调用详解

    本部分主要讲述的是文件I/O操作的2.6.17.9内核版本实现,包括了主要的数据结构、宏定义和函数流程。以下分别讲述open,create,close,read,write,lseek系统调用。

    UNIX环境高级编程_第2版.part1

    UNIX环境高级编程_第2版 ----------------------------------------------------------- 共两个压缩包( UNIX环境高级编程_第2版.part1 UNIX环境高级编程_第2版.part1 ) ------------------------------------------...

    APUE(UNIX环境高级编程)——文件I/O篇

    本章开始讨论UNIX系统,先说明可用的文件I/O函数——打开文件、读文件、写文件等等。 大多数UNIX文件I/O只需用到5个函数: open read write lseek close 然后说明不同缓存器长度对read和write函数的影响。本章所...

    《Linux系统编程、网络编程》第1章:文件IO

    课程内容:什么是API,OS API与库API,open函数,read/write/close函数,lseek函数,进程表和文件描述符表,对文件进行共享操作,dup/dup2函数,fcntl函数

Global site tag (gtag.js) - Google Analytics