Linux i/o 读写文件

获取文件描述后,就可以对文件进行读写操作。

1、读文件

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

参数:

fd:文件描述符

buf:存储读取缓存

len:预计读取的字节数

返回值:

实际读取的字节数。

描述:

调用read后,系统会从fd参数所引用文件的当前位置读取len个字节,到buf中去。返回值是写入到buf的字节数目。执行成功,返回读取的字节数;失败返回-1,并设置erron。

read读取的所有可能结果:

①return == len。 正常

②0< return < len。两种情况,

第一:读取过程被信号中断,可供读取的字节数大于0小于len,读过程中被中断

第二:读取到len个字节之前到达了EOF。

重新进行read()调用可把剩余的字节读进剩余的缓冲区。

③return == 0。eof

④被阻塞

⑤ return == -1 && erron == EINTR。开始读之前就被中断了

⑥ return == -1 && erron == EAGAIN。被阻塞,应该稍后再进行调用。

⑦ return == -1 && erron == otherValue。严重错误

读取文件code demo:

//要读取len个字节
ssize_t ret;
while(len != 0 && (ret=read(fd, buf, len))!=0){
    if(ret == -1){
       if(erron == EINTR){
          continue;
      }else if(erron == EAGAIN){
          sleep(1);
      }else{
      perror("read error");
       break;
      }        
    }
    len -= ret;
    buf += ret;
}

2、写文件

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

参数:

fd:文件描述符

buf:要写入的字节缓冲

count:要写入的字节数

返回值:

实际上写入的字节数

描述:

从buf开始将count个字节写入fd所指向文件的位置。执行成功后,文件位置会随之更新。write不像read会到达文件的eof位置,除了socket外,也不会只写入部分字节。

当返回部分字节时读取方法:

ssize_t ret, nr;
while(len != 0 && (ret = write(fd, buf, len)) != 0){
    if(ret == -1){
        if(errno == EINTR){
            continue;
        }
        perror("write");
        break;
    }
    len -=ret;
    buf += ret;
}

为了提高效率,内核把数据写入磁盘时,会有缓冲。缓冲时间可以通过参数

/proc/sys/vm/dirty_expire_centiseconds来设定此值。

tips:

size_t/ssize_t是posix所规定的数据类型。32位系统上,他们分别代表unsigned int / int。

时间: 2024-12-16 07:29:00

Linux i/o 读写文件的相关文章

Android 如何在linux kernel 中读写文件

前言 欢迎大家我分享和推荐好用的代码段~~ 声明 欢迎转载,但请保留文章原始出处: CSDN:http://www.csdn.net 雨季o莫忧离:http://blog.csdn.net/luckkof 正文 [Description] 如何在linux kernel 中读写文件 [Keyword] linux kernel read write file 读写文件 [Solution] 通常我们只会在linux native/app 层 读写文件,但可能有一些非常特别的情况下,我们需要直接在

Android 怎样在linux kernel 中读写文件

前言 欢迎大家我分享和推荐好用的代码段~~ 声明 欢迎转载,但请保留文章原始出处: CSDN:http://www.csdn.net 雨季o莫忧离:http://blog.csdn.net/luckkof 正文 [Description] 怎样在linux kernel 中读写文件 [Keyword] linux kernel read write file 读写文件 [Solution] 通常我们仅仅会在linux native/app 层 读写文件,但可能有一些很特别的情况下,我们须要直接在

在linux内核中读写文件

http://blog.csdn.net/tommy_wxie/article/details/8194276 1. 序曲 在用户态,读写文件可以通过read和write这两个系统调用来完成(C库函数实际上是对系统调用的封装). 但是,在内核态没有这样的系统调用,我们又该如何读写文件呢? 阅读Linux内核源码,可以知道陷入内核执行的是实际执行的是sys_read和sys_write这两个函数,但是这两个函数没有使用EXPORT_SYMBOL导出,也就是说其他模块不能使用. 在fs/open.c

【转】在linux内核中读写文件 -- 不错

原文网址:http://blog.csdn.net/tommy_wxie/article/details/8194276 1. 序曲 在用户态,读写文件可以通过read和write这两个系统调用来完成(C库函数实际上是对系统调用的封装). 但是,在内核态没有这样的系统调用,我们又该如何读写文件呢? 阅读linux内核源码,可以知道陷入内核执行的是实际执行的是sys_read和sys_write这两个函数,但是这两个函数没有使用EXPORT_SYMBOL导出,也就是说其他模块不能使用. 在fs/o

在linux内核中读写文件2

1,内核代码 #include <linux/kernel.h> #include <linux/init.h> #include <linux/types.h> #include <linux/spinlock.h> #include <linux/blkdev.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/errno.h>

Linux环境编程之文件I/O(三):文件的读写

(一) 当我们打开了一个文件后,一般对文件的操作就是读写.读写函数分别是read.write. #include <unistd.h> ssize_t read(int fd, void *buf, size_t count); 参数: fd:利用open.creat得到的文件描述符. buf:buf是void *类型,用于表示通用指针,此处指所读取到的数据的内存缓冲. count:需要读取的数据量. 返回值:成功执行时,返回所读取的数据的字节数,一般等于或小于所请求读取的数据字节数.若已到文

Linux一个简单的读写文件

(1)linux中的文件描述符fd的合法范围是0或者一个正正数,不可能是一个负数. (2)open返回的fd程序必须记录好,以后向这个文件的所有操作都要靠这个fd去对应这个文件,最后关闭文件时也需要fd去指定关闭这个文件.如果在我们关闭文件前fd丢掉了那就惨了,这个文件没法关闭了也没法读写了. 提醒:实时查man手册 (1)当我们写应用程序时,很多API原型都不可能记得,所以要实时查询,用man手册 (2)man 1 xx查linux shell命令,man 2 xxx查API, man 3 x

linux下c通过虚拟地址映射读写文件的代码

在代码过程中中,把开发过程中比较好的一些代码片段记录起来,如下的代码内容是关于 linux下c通过虚拟地址映射读写文件的代码,应该对小伙伴有些好处.#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<fcntl.h>#include<sys/stat.h>#include<string.h>#include<sys/mman.h>struct stu{

Linux平台下利用系统接口函数按照行读写文件

要求:支持大文件(1M)一次性读入 源代码如下: #include<stdio.h> #include<fcntl.h> #include<stdlib.h> #include<string.h> #define rwmode 2 //清屏命令函数 void clear() { char clscode[] = {0x1B, 0x5B, 0x48, 0x1B, 0x5B, 0x4A}; printf("%s",clscode); } //