系统文件I/O

先从代码中来看:

//写文件
int main()
{umask(0);int fd=open("myfile",O_WRONLY|O_CREAT,0644);if(fd<0){perror("open");return 1;int count=5;const char*msg="hello world\n";int len=strlen(msg);while(count--){write(fd,msg,len);}close(fd);return 0;
}
//读文件
int main()
{int fd=open("myfile",O_WRONLY);if(fd<0){perror("open");return 1;}const char*msg="hello world\n";char buf[1024];while(1){ssize_t s=read(fd,buf,strlen(msg));if(s>0){printf("%s",buf);}else{break;}}close(fd);return 0;
}

open()

int open(const char*pathname,int flags)
int open(const char*pathname,int flags,mode_t mode)
//pathname:要打开或创建的目标文件
//flags:打开文件时,可以传入多个参数选项,可以用虾米一个或多个常量进行“或”运算,构成flags。
参数:
O_RDONLY:只读打开
O_WRONLY:只写打开
O_RDWR:读写打开
这三个常量有些只能有一个
O_CREAT:若文件不存在,则需要创建,需要使用mode选项,指明新文件的权限
O_APPEND:追加写
返回值:成功:新打开文件的描述符失败:-1

系统调用和库函数

刚刚使用的read,write,close,open都属于系统提供的接口,称之为系统调用接口
fopen,fclose,fread,fwrite都是C标准库中的函数,称之为库函数
系统调用:指运行在用户空间的应用程序向操作系统内核请求某些服务的调用过程。
库函数:是由用户或组织自己开发的,具有一定功能的函数集合,是对系统调用的封装。

文件描述符(fd)

文件描述符就是非负的整数,他是一个索引值,指向内核中打开文件的记录表。

0&1&2

 1. LINUX进程默认情况下会有三个缺省打开的文件描述符,分别是标准输入(stdin)0,标准输出(stdout)1,标准错误(stderr)22. 0,1,2对应的物理设备一般是:键盘、显示器、显示器

由上图我们可知,当我们要打开新的文件时,操作系统在内存中要创建相对应的数据结构来描述目标文件,产生了file结构体,表示一个已经打开的文件对象,而当进程执行open系统调用,所以需要将进程和文件关联起来,因此每个进程都有一个指针*files,指向一张表files_strucrt,该表最重要的一部分就是包含了一个指针数组,每个元素都是一个指向打开文件的指针,所以本质上,文件描述符就是该数组的下标。

文件描述符分配规则

在file_struct数组当中,找到当前没有被使用的最小的一个下标,作为新的文件描述符。

重定向

int main()
{close(1);int fd=open("myfile",O_WRONLY|O_CREAT,00644);if(fd<0){perror("open");return 1;}prinitf("fd:%d\n",fd);fflush(stdout);close(fd);exit(0);
}

通过上面的代码我们可以看出来,本该输出到显示器上的内容,输出到了文件myfile中,并且其中fd为1,这种现象称之为重定向,常见的重定向有>,>>,<
重定向的本质

由上图我们可以看出,当stdout访问底层文件时候,找的还是fd==1的文件,此时fd=1所表示的内容已经是myfile的地址,不再是显示文件的地址,所以,输出的所有消息都会被写入到myfile文件中,从而完成输出重定向。

在file结构体中最重要的两个成员变量:文件描述符缓冲区大小
缓冲区

1.全缓冲:当缓冲区数据填满时刷新
2.行缓冲:当遇到/n时立即刷新
3.无缓冲:直接输出

fd和FILE结构体相关推荐

  1. linux存储--文件描述符fd与FILE结构体(二)

    文件描述符fd 对于linux而言,所有对设备(对于linux而言,一切皆文件)和文件的操作都使用文件描述符来进行的. 文件描述符是一个非负的整数,它是一个索引值,指向内核中每个进程打开文件的记录表. ...

  2. fd与FILE结构体

    文件描述符 每个进程都有一个指针*file,指向表file_struct,该表中最重要的部分是fd_array[]的一个指针数组,每个元素都是一个指向打开文件的指针.文件描述符就是该数组的下标.系统对 ...

  3. FILE 结构体的定义,inode ,软链接和硬链接的理解

    一.FILE结构体: C将每个文件简单地作为顺序字节流.每个文件用文件结束符结束,或者在特定字节数的地方结束,这个特定的字节数可以存储在系统维护的管理数据结构中.当打开文件时,就建立了和文件的关系. ...

  4. OS / Linux / 文件描述符以及 file 结构体

    零.前言 程序可以理解为硬盘上的普通二进制文件:进程是加载到内存中的二进制文件,除了加载到内存中的二进制文件外,还附有所有对于该二进制文件描述信息的结构体,描述该进程的结构体叫PCB(进程控制块),在 ...

  5. linux创建文件结构体,Linux file 结构体和 inode 结构体,Go语言入门技术,Go语言基础...

    在设备驱动程序中,一般需要关心两个结构体:file 和 inode. 1. file 结构体 file 结构体代表一个打开的文件,系统中每个打开的文件在内核空间都有一个关联的 struct file. ...

  6. file结构体中private_data指针的疑惑

    转:http://www.360doc.com/content/12/0506/19/1299815_209093142.shtml hi all and barry, 最近在学习字符设备驱动,不太明 ...

  7. FILE结构体在stdio.h头文件源码里的详细代码

    找了很久终于找到了! 我的stdio.h位置如下: C:\msys64\mingw64\x86_64-w64-mingw32\include 我终于在源码里面找到了FILE结构体的定义!!! 这里就涉 ...

  8. C语言 FILE结构体

    C语言的stdio.h头文件中,定义了用于文件操作的结构体FILE.这样,我们通过fopen返回一个文件指针(指向FILE结构体的指针)来进行文件操作. #ifndef _FILE_DEFINED s ...

  9. C语言中的FILE结构体

    内存中的数据都是暂时的,当程序结束时,它们都将丢失.为了永久性的保存大量的数据,C语言提供了对文件的操作. 1.文件和流 C将每个文件简单地作为顺序字节流(如下图).每个文件用文件结束符结束,或者在特 ...

最新文章

  1. mysql left join超时,MySQL 行锁超时排查方法优化
  2. ashx和asmx的HttpContext
  3. 读书笔记 --- [基础知识点] 小结2
  4. 3分钟掌握Quartz.net分布式定时任务的姿势
  5. [html] 页面上的登录表单记住了密码(显示星号),但我又忘了密码,如何找回这个密码呢?
  6. Tomcat基础教程(一)
  7. SQL笔记-通过构建索引表方便数据库管理
  8. nginx开发(二)配置mp4文件在线播放
  9. 与IDE相关的Attribute属性(C#)
  10. matlab振荡环节的频率特性,频率特性曲线
  11. 怎么看python帮助手册常见问题商家认证_常见问题(FAQ) - Scrapy 中文文档
  12. visio流程图添加连接点
  13. 通过外挂程序实现SBO中的价格控制策略
  14. 【web前端】前端性能优化指南,还不来看看?
  15. nlp自然语言处理_nlp满足可持续投资
  16. python 闭包 lambda_Python lambda闭包范围
  17. 基于51单片机十字路口交通灯_只显示绿灯时间+黄灯5s
  18. 在ALLEGRO中添加中文字体
  19. 已知等价关系求商集_等价关系习题.docx
  20. (试除法+unordered_map+因式分解)acwing 870. 约数个数

热门文章

  1. git push失败:Unable to access 'https://gitee.com/Lmui/proxy.git/': Could not resolve host: gitee.com
  2. SqlCommand.ExecuteNonQuery()方法的使用注意
  3. ListView与ListView适配器
  4. 一个小需求引发的思考
  5. (点击||敲击)发出声音特效「HTML+CSS+JavaScript」项目总结
  6. 没有群晖却要共享文件?试试HFS搭建精简版NAS吧
  7. 全国计算机等级考试三级数据库知识点总结!
  8. Java:输入年月日,输出这一天是这一年的第几天。
  9. 记-微服务CPU100%排查之windows版
  10. C++:求整数num中包含因子k的个数