文件 I/O操作open、lseek、read、write、close详解

原创 2018年04月15日 17:16:06

一,文件描述符、套接字和管道

        对于内核而言,所有打开的打开的文件都通过文件描述符引用。文件描述符是一个非负整数。

        内核为每个进程维护一个结构体struct task_struct,可称为进程控制块(PCB: Process Control Block)或进程描述符,含有一个称为打开文件描述符表的子结构体。普通的文件、套接字和管道都被放入其中,这说明这三者都被抽象为文件,共同占用进程占用的打开文件描述符。

        其中UNIX系统shell使用:

        文件描述符0与进程的标准输入相关联;

        文件描述符1标准输出相关联;

        文件描述符2标准出错输出相关联。


二,文件I/O函数

    1,open 函数可以打开或创建一个文件。

#include <fcntl.h>

int open(const char *pathname, int oflag, ... /* mode_t mode */ );

返回值:成功则返回文件描述符,出错则返回-1。

参数:

    pathname:是要打开或创建文件的名字。

    oflag:说明此函数的多个选项。可将它的选项进行“或”运算构成oflag。

            O_RDONLY            只读打开。

            O_WRONLY            只写打开。

            O_RDWR                读、写打开。

            这三个选项只能制定且必须一个。下列常量可选:

            O_APPEND            每次都从文件尾端写。

            O_CREAT               若文件不存在,则创建它。使用次选项必须带第三个参数。

            O_EXECL                如果指定了O_EXECL,而文件存在,则会出错。可以用它测试一个文件是否存在,如果不存在,则创建它。

            O_TRUNC                如果此文件存在,而且为只写或只读打开,则将其长度截短为0。

    2,create函数创建一个文件

#include <fcntl.h>

int create(const char *pathname, mode_t mode);

    返回值:成功则返回打开的文件描述符,出错则返回-1。

    由于它只能以只写的方式打开所创建的文件,所以等效于:

open(pathname, 0_WRONLY | O_CREAT | O_TRUNC, mode);

    3,close函数关闭一个打开的文件

#include <unistd.h>

int close(int filedes)

    返回值:成功则返回打开的文件描述符,出错则返回-1。

    如果一个进程没有调用close显示关闭,当进程终止时,内核会自动关闭它所有打开的文件。

    4,lseek函数 为一个打开的文件设置偏移量

     每个打开的文件都有一个与其关联的“当前文件偏移量”,它是一个非负整数,用以度量从文件开始处计算的字节数。默认情况下,打开一个文件,该偏移量被设置为0,除非制定了O_APPEND选项。

#include <unistd.h>

off_t lseek(int filedes, off_t offset, int whence)

    返回值:成功则返回新的文件的偏移量,出错则返回-1。

    参数:设置的偏移量offset与whence有关。

        whence     文件的偏移量设置为offset值
SEEK_SET文件开始处offset个字节必须为正数
SEEK_CUR文件偏移量当前值加offset可正可负
SEEK_END文件长度加offset可正可负

    如何确定当前打开文件的偏移量:

int curpose;
curpose = lseek(filedes, 0, SEEK_CUR);

    也可以用来判断所涉及的文件是否可以设置偏移量。因为文件描述符引用的是一个管道、FIFO或网络套接字,则lseek返回-1,并将error设置为ESPIPE。

    注意:lseek(file, 163840, SEEK_SET);如果文件偏移量大于文件的当前长度,对该文件的下一次写将加长该文件,并在文件中构成一个空洞,这些空洞不在磁盘上占用存储区,位于文件中但没有写过的字节都被读为0(即空洞都被读为0)。

    5,read函数 从打开的文件读数据

#include <unistd.h>

ssize_t read(int filedes, void *buf, size_t nbytes);

    返回值:

  • 若成功返回读到的字节数;
  • 若已到文件结尾返回0;
  • 若出错返回-1。        

    实际读到的字节数有可能少于要求读的字节数 nbytes:

  • 读取普通文件时,在读到要求字节数时已到达文件末尾。例如,若在到达文件末尾之前还有30个字节,而要求读100个字节,则read返回30,下一次再调用read时,它将返回0(文件尾端)。
  • 当从终端设备读时,通常一次最多读一行。
  • 当从网络读时,网络中的缓冲机构可能造成返回值小于所要求读的字节数。
  • 当从管道或FIFO读时,如管道包含的字节少于所需的数量,那么read将只返回实际可用的字节数。
  • 当某一信号造成中断,而已经读了部分数据量时。

    6,write函数 向打开的文件写入数据

#include <unistd.h>

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

    返回值:

  • 若成功返回已写入的字节数;
  • 如出错返回-1。

    返回值通常与参数nbytes的值相同,否则表示出错(比如缓冲区已满)。

               

       

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010765526/article/details/79949662

文件I/O函数(open,read,write,lseek,close)

大多数unix文件I/O只需要用到5个函数:open,read,write,lseek,close。这些函数都为不带缓存的I/O,不带缓存指的是每个read和write都调用内核中的一个系统调用。这些...
  • jiangqin115
  • jiangqin115
  • 2015-05-02 12:28:21
  • 1174

嵌入式linux文件I/O编程 (open、read、write、lseek、close)

Normal 0 7.8 磅 0 2 false false false Microsof...
  • sunhy1021
  • sunhy1021
  • 2009-10-26 14:09:00
  • 7990

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

Linux基础编程-文件操作open,lseek,read,write,closeLinux上面对文件的操作可以分为两种:1.Linux系统提供的API; 2.C标准的文件操作函数。前者依赖于Linu...
  • Yao_GUET
  • Yao_GUET
  • 2011-06-02 11:10:00
  • 13399

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

Linux C file操作: open write read lseek close函数分析
  • renlonggg
  • renlonggg
  • 2017-01-19 11:35:57
  • 1172

Linux文件I/O(creat/open/read/write/lseek/close/dup/sync)

先来提一下文件标识符的概念,对内核而言,所有打开的文件都通过文件描述符引用。文件描述符是一个非负整数,打开或创建一个文件的时候,内核向进程返回它的描述符。我们要进行读写操作的时候,把这个描述符传给re...
  • wuchunlai_2012
  • wuchunlai_2012
  • 2016-02-03 14:27:12
  • 643

Linux系统调用及用户编程接口(API) open close write read lseek

系统调用:操作系统提供给用户程序调用的一组“特殊接口,可以通过这组接口获得操作系统内核提供的服务。例如:创建进程、实现进程调度、进程管理,进程间通信,文件系统控制,系统控制,存储管理,网络管理,soc...
  • lyk314949530
  • lyk314949530
  • 2017-05-24 20:35:15
  • 366

对应于Linux中open, read, write, seek, close的windows API

文件的打开 FILE *fopen( "路径+文件名","读写模式"); FILE *fopen(const char *filename, const char *m...
  • wangjingfei
  • wangjingfei
  • 2009-10-28 15:02:00
  • 4092

【Linux&Unix--open/close/write/read系统调用】

open系统调用 函数原型及解释 【代码】          调用 open 可以打开一个已经存在的文件(普通文件、特殊文件或命名管道),或创建一个新文件,但它只能创建普通文件(创建特殊文件需要...
  • kana007
  • kana007
  • 2014-08-17 00:40:03
  • 2907

Linux 文件系统调用函数open close read write lseek perror

Linux系统中操作文件有两种方式,一种是标准C的文件执行函数,一般以f开头,fopen,fread,fwrite等等,这种操作执行是带缓存的,一般系统会对它进行优化,另外一种是系统调用,open, ...
  • swjtufq
  • swjtufq
  • 2016-11-24 11:07:52
  • 436

Linux C语言中的read write lseek的使用

命题:将一个文件中的内容复制到另一个文件中进行保存 首先分析命题可以知道,复制的操作,使用到的是Linux中的read,write,lseek等操作,因此本文章着重使用这三个函数进行文件的复制 作...
  • psr1999
  • psr1999
  • 2016-11-02 22:35:53
  • 2403
收藏助手
不良信息举报
您举报文章:文件 I/O操作open、lseek、read、write、close详解
举报原因:
原因补充:

(最多只允许输入30个字)