我们都知道linux下所有设备都是以文件存在的,所以当我们需要用到这些设备的时候,首先就需要打开它们,下面我们来详细了解一下文件I/O操作。

用到的文件I/O有以下几个操作:打开文件、读文件、写文件、关闭文件等,对应用到的函数有:open、read、write、close、lseek(文件指针偏移)

文件描述符:对于内核而言,所有打开的文件都通过文件按描述符引用。文件描述符是一个非负整数。
                      当打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。
                      当读、写一个文件时,使用open/creat返回的文件描述符标识该文件,将其作为参数传送给read或write。

linux系统下文件描述符0是标准输入,1是标准输出,2是标准出错,所以一般打开文件的时候文件描述符都是从3开始。 这里read和write是不能格式化读取和写入,如果想了解文件怎么格式化读取和写入的话,可以看看我以前写的一篇随笔。

一、打开文件
()头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> ()函数原型 int open(const char *pathname, int flags); 参数:
a、pathname:打开或者创建的文件名字,如"text" b、 flags:
O_RDONLY:只读打开
O_WRONLY:只写打开
O_RDWR:读、写打开
O_CREAT:若此文件不存在则创建它,使用O_CREAT时后面要跟文件的访问权限位,如O_CREAT,
O_APPEND:每次写时都追加到文件的尾端
O_EXCL :如果同时指定了O_CREAT,而文件已经存在,则出错,用此可以测试一个文件是否
存在,如果不存在,则创建此文件,这使测试和创建两者成为一个原子操作
O_DSYNC:使每次write等待物理I/O操作完成,但是如果该写操作并不影响读取刚写入的
数据,则不需等待文件属性被更新
O_NONBLOCK :如果path引用的是一个FIFO、一个块特殊文件或一个字符特殊文件,则
此选项为文件的本次打开操作和后续的I/O操作设置非阻塞方式
O_NOCTTY:如果path引用的是 终端设备,则将该设备分配为此进程的控制终端
O_SYNC:使每次write要等待物理I/O操作完成,包括有该write引起的文件属性更新所需的I/O
O_TRUNC:如果文件存在,并且是常规文件而且以读写或者只写打开,则将其长度截断为0,
如果文件是FIFO或终端设备文件,O_TRUNC标志被忽略,否则O_TRUNC不明确
O_DIRECTORY:如果pathname引用的不是目录,则出错 ()返回值:
成功:文件描述符
失败:- 二、读取文件
()头文件 #include <unistd.h> ()函数原型 ssize_t read(int fd, void *buf, size_t count);
参数:
a、fd:调用open后返回的文件描述符
b、buf:用来存放从文件中读到的数据的缓冲区
c、count:读取的字节数 ()返回值:
成功:读到的字节数,如果读到文件尾端,则返回0
失败:- 三、写数据
()头文件 #include <unistd.h> ()函数原型 ssize_t write(int fd, const void *buf, size_t count);
参数:
a、fd:调用open后返回的文件描述符
b、buf:从来存放数据的缓冲区
c、count:写入数据的字节数 ()返回值:
成功:返回已写的字节数
失败:- 四、关闭文件
()头文件 #include <unistd.h> ()函数原型 int close(int fd);
参数:
a、fd:调用open后返回的文件描述符 五、文件偏移
()头文件 #include <sys/types.h>
#include <unistd.h> ()函数原型 off_t lseek(int fd, off_t offset, int whence);
参数:
a、fd:调用open后返回的文件描述符
b、offset 和参数whence有关,通常设置为0 (according to thedirective whence as follows)
c、whence:
SEEK_SET: 将文件的偏移量设置为距文件开始处offset个字节
SEEK_CUR:将文件的偏移量设置为其当前值加offset个字节,offset可为正或负
SEEK_END: 将文件的偏移量设置为文件长度加offset,offset可为正或负 ()返回值:
成功:返回新的文件偏移量
失败:-

下面是代码:

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/fcntl.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h> #define PATHNAME "text.txt"
#define LENGTH 4096 void error(char *name) //错误提示
{
perror(name);
exit();
} int main(int argc,char *argv[])
{ int fd ; //存放文件描述符
int size1; //读操作时的返回值
int size; //写操作时的返回值
int offset; //文件偏移量 //打开文件
/*O_REWR表示已读写权限打开文件,O_CREAT表示如果文件不存在则创建
*创建的新文件的权限为0777,即是可读可写可执行,O_APPEND表示
*写入数据时从文件尾端写入*/
if((fd = open(PATHNAME,O_RDWR|O_CREAT|O_APPEND,)) == -)
{
error("open");
} char buf[LENGTH];
bzero(buf,sizeof(buf)); //从文件中读取数据
if((size1 = read(fd,buf,sizeof(buf))) == -)
{
error("read");
} printf("%s\n",buf); char buf1[LENGTH] = "小世界";
//写入数据到文件中
if((size = write(fd,buf1,strlen(buf1))) == -)
{
error("write");
} char buf3[LENGTH] = "hello world";
if((size = write(fd,buf3,strlen(buf3))) == -)
{
error("write");
} //因为写入数据到文件中的时候已经把文件指针偏移到文件尾端了,所以要重新把文件指针偏移到文件头,方便下面的读操作
if((offset = lseek(fd,,SEEK_SET)) == -)
{
error("lseek");
} bzero(buf,sizeof(buf));
if((size1 = read(fd,buf,sizeof(buf))) == -)
{
error("read");
}
printf("%s\n",buf); //关闭文件
close(fd);
return ;
}
  • 用cat命令打开文件
  • 终端输出

linux中文件I/O操作(系统I/O)的更多相关文章

  1. [转]Linux中文件权限目录权限的意义及权限对文件目录的意义

    转自:http://www.jb51.net/article/77458.htm linux中目录与文件权限的意义 一.文件权限的意义 r:可以读这个文件的具体内容: w:可以编辑这个文件的内容,包括 ...

  2. linux中文件IO

    一. linux常用文件IO接口 1.1. 文件描述符 1.1.1. 文件描述符的本质是一个数字,这个数字本质上是进程表中文件描述符表的一个表项,进程通过文件描述符作为index去索引查表得到文件表指 ...

  3. kernel中文件的读写操作可以使用vfs_read()和vfs_write

    需要在Linux kernel--大多是在需要调试的驱动程序--中读写文件数据.在kernel中操作文件没有标准库可用,需要利用kernel的一些函数,这些函数主要有: filp_open() fil ...

  4. (六)kernel中文件的读写操作可以使用vfs_read()和vfs_write

    需要在Linux kernel--大多是在需要调试的驱动程序--中读写文件数据.在kernel中操作文件没有标准库可用,需要利用kernel的一些函数,这些函数主要有: filp_open() fil ...

  5. LSOF查看linux中文件打开情况

    如何查看linux中文件打开情况 前言 我们都知道,在linux下,“一切皆文件”,因此有时候查看文件的打开情况,就显得格外重要,而这里有一个命令能够在这件事上很好的帮助我们-它就是lsof. lin ...

  6. linux中文件压缩介绍

    原文内容来自于LZ(楼主)的印象笔记,如出现排版异常或图片丢失等问题,可查看当前链接:https://app.yinxiang.com/shard/s17/nl/19391737/1c62bb7f-f ...

  7. linux中文件颜色,蓝色,白色等各自代表的含义

    linux中文件颜色,蓝色,白色等各自代表的含义 绿色文件---------- 可执行文件,可执行的程序 红色文件-----------压缩文件或者包文件 蓝色文件----------目录 白色文件- ...

  8. 【linux之文件查看,操作】

    一.shell如何处理命令 1.shell会根据在命令中出现的空格字符,将命令划分为多个部分 2.判断第一个字段是内部命令还是外部命令 内部命令:内置于shell的命令(shell builtin) ...

  9. 【linux之文件查看,操作,权限管理】

    一.shell如何处理命令 1.shell会根据在命令中出现的空格字符,将命令划分为多个部分 2.判断第一个字段是内部命令还是外部命令 内部命令:内置于shell的命令(shell builtin) ...

随机推荐

  1. 大数据算法->推荐系统常用算法之基于内容的推荐系统算法

    港真,自己一直非常希望做算法工程师,所以自己现在开始对现在常用的大数据算法进行不断地学习,今天了解到的算法,就是我们生活中无处不在的推荐系统算法. 其实,向别人推荐商品是一个很常见的现象,比如我用了一 ...

  2. Solr-Centos7 安装部署solr-5.5.4

    一 下载安装所需文件 http://archive.apache.org/dist/lucene/solr/ solr-5.5.4.tgz http://archive.apache.org/dist ...

  3. Qt之对话框消失动画

    一.效果展示 最近做了一个提示框消失的功能,觉着挺有意思,以前一直以为Qt子窗口不能做淡出效果,其实Qt的淡出功能已经帮我们封装好了,我们仅仅只需要几行代码就可以做出酷炫的窗口关闭效果,写此篇文章的时 ...

  4. 假面舞会[NOI2008]

    题目描述 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具.每个面具都有一个编号,主办方会把此编号告 ...

  5. 微信小程序movable-view移动图片和双指缩放

    先从movable-view开始说起吧. movable-view是小程序自定义的组件.其描述为:"可移动的视图容器,在页面中可以拖拽滑动". 官方文档地址:https://mp. ...

  6. 谈一谈EasyUI的TreeGrid的过滤功能

    写在最前面 这个星期一直在纠结easyui的treegrid的过滤功能,原因呢,自然是项目中一个莫名奇妙的需求. easyui虽说是后端程序员的前端框架,但是说句实话,除去api,让我直接写里面的节点 ...

  7. iOS设置状态栏样式

    iOS设置状态栏样式可以使用两种方式. 方式一: 直接在需要改变默认状态栏样式的控制器中实现一个方法(其他任何事情都不用做): // 返回状态栏的样式 - (UIStatusBarStyle)pref ...

  8. TCP/IP卷一:第一章

    ================================================= 版權聲明:如需轉載,請列明出處:HingAglaiaWong@博客園 支持原創,是對作者最好的的鼓勵 ...

  9. POJ 2411 Mondriaan's Dream:网格密铺类 状压dp

    题目链接:http://poj.org/problem?id=2411 题意: 给你一个n*m的网格 (1<=n,m<=11) ,往里面铺1*2或2*1的砖块,问你铺完这个网格有多少种不同 ...

  10. 关于div+css排版布局中需注意的细节问题

    第一个注意点:选择器的使用(标签.class.id) 三种选择器中id(#)的优先级最高,根据id名筛选出唯一元素: 如下输入:#menu{ width:1200px; height:45px; ba ...