1、文件描述符

(1)文件描述符的本质是一个数字,这个数字本质上是进程表中文件描述符表的一个表项,进程通过文件描述符作为index去索引查表得到文件表指针,再间接访问得到这个文件对应的文件表。

(2)文件描述符这个数字是open系统调用内部由操作系统自动分配的,操作系统分配这个fd时也不是随意分配,也是遵照一定的规律的,我们现在就要研究这个规律。

(3)操作系统规定,fd从0开始依次增加。fd也是有最大限制的,在linux的早期版本中(0.11)fd最大是20,所以当时一个进程最多允许打开20个文件。linux中文件描述符表是个数组(不是链表),所以这个文件描述符表其实就是一个数组,fd是index,文件表指针是value

(4)当我们去open时,内核会从文件描述符表中挑选一个最小的未被使用的数字给我们返回。也就是说如果之前fd已经占满了0-9,那么我们下次open得到的一定是10.(但是如果上一个fd得到的是9,下一个不一定是10,这是因为可能前面更小的一个fd已经被close释放掉了)

(5)fd中0、1、2已经默认被系统占用了,因此用户进程得到的最小的fd就是3了。

(6)linux内核占用了0、1、2这三个fd是有用的,当我们运行一个程序得到一个进程时,内部就默认已经打开了3个文件,这三个文件对应的fd就是0、1、2。这三个文件分别叫stdin、stdout、stderr。也就是标准输入、标准输出、标准错误。

(7)标准输入一般对应的是键盘(可以理解为:0这个fd对应的是键盘的设备文件),标准输出一般是LCD显示器(可以理解为:1对应LCD的设备文件)

(8)printf函数其实就是默认输出到标准输出stdout上了。stdio中还有一个函数叫fpirntf,这个函数就可以指定输出到哪个文件描述符中。

2、常用API

open、close、write、read、lseek

2.1OPEN

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

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

const char *pathname为需要打开的文件、

flags通过一些宏设置读写权限

O_RDONLY、 O_WRONLY 、O_RDWR(只读 只写 读写)

O_APPEND O_APPEND属性去打开文件时,如果这个文件中本来是有内容的,则新写入的内容会接续到原来内容的后面

O_TRUNC  O_TRUNC属性去打开文件时,如果这个文件中本来是有内容的,则原来的内容会被丢弃。

O_CREAT   O_CREAT若不存在则创建。open函数在使用O_CREAT标志去创建文件时,可以使用第三个参数mode来指定要创建的文件的权限。mode使用4个数字来指定权限的,其中后面三个很重要,对应我们要创建的这个文件的权限标志。譬如一般创建一个可读可写不可执行的文件就用0666

O_EXCL  加上O_EXCL如果文件已经被打开则打开失败

O_NONBLOCK 默认为阻塞模式。添加这个设置为非阻塞模式

O_SYNC write阻塞等待底层完成写入才返回到应用层。

2.2 read

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

2.3 write

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

2.3lseek

执行read与write函数都会使文件指针移动。lseek函数可以调整文件指针。

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

参数解释。第一个代表文件描述符、第二个代表移动个数、第三个设置移动头。

lseek(fd, 0 ,SEEK_SET);//文件指针指向头

SEEK_SET代表指向头

SEEK_END代表尾部

SEEK_CUR代表当前位置

3.3close

可以通过close关闭打开的文件描述符。

3.4dup和dup2函数

(1)dup系统调用对fd进行复制,会返回一个新的文件描述符(譬如原来的fd是3,返回的就是4)

(2)dup系统调用有一个特点,就是自己不能指定复制后得到的fd的数字是多少,而是由操作系统内部自动分配的,分配的原则遵守fd分配的原则

(3)dup2和dup的作用是一样的,都是复制一个新的文件描述符。但是dup2允许用户指定新的文件描述符的数字。

3.5fcntl的原型和作用

fcntl函数是一个多功能文件管理的工具箱,接收2个参数+1个变参。第一个参数是fd表示要操作哪个文件,第二个参数是cmd表示要进行哪个命令操作。变参是用来传递参数的,要配合cmd来使用。

4、标准IO库介绍

4.1、标准IO和文件IO有什么区别

(1)看起来使用时都是函数,但是:标准IO是C库函数,而文件IO是linux系统的API

(2)C语言库函数是由API封装而来的。库函数内部也是通过调用API来完成操作的,但是库函数因为多了一层封装,所以比API要更加好用一些。

(3)库函数比API还有一个优势就是:API在不同的操作系统之间是不能通用的,但是C库函数在不同操作系统中几乎是一样的。所以C库函数具有可移植性而API不具有可移植性。

(4)性能上和易用性上看,C库函数一般要好一些。譬如IO,文件IO是不带缓存的,而标准IO是带缓存的,因此标准IO比文件IO性能要更高。

4.2、常用标准IO函数介绍

(1)常见的标准IO库函数有:fopen、fclose、fwrite、fread、ffulsh、fseek

#include #include#include#include#include#include

int main(int argc , char *argv[])

{int fd=-1; //fd 文件描述符

char buf[100]={0};//字符缓冲区

char writebuf[20]="ilovezw";//字符缓冲区

intret;//第一步打开//fd = open ("a.txt",O_RDWR|O_APPEND);

fd = open ("a.txt",O_RDWR);if(-1 ==fd)

{

perror("文件打开错误");

_exit(-1);

}else{

printf("文件打开成功,fd=%d.\n",fd);

}//lseek(fd, 3 ,SEEK_SET);//光标位移3//第二步读写

ret=write(fd,writebuf,strlen(writebuf));//写函数

if(-1==ret)

{//printf("write error");

perror("write error");

_exit(-1);

}else{

printf("ret=%d\n",ret);//lseek(fd, -ret ,SEEK_SET);//光标位移3

}

lseek(fd,0 ,SEEK_SET);//文件指针指向头

ret=read(fd,buf,20);//读文件

if(-1==ret)

{//printf("read error");

perror("read error");

_exit(-1);

}else{

printf("ret=%d,a.txt=%s\n",ret,buf);

}//第三步关闭

close(fd);return 0;

}

/*标准IO

*/

#include#include#include

int main(int argc,char *argv[])

{

FILE*fp =NULL;char buf[10];

fp= fopen("1.txt","r+");if(NULL ==fp)

{

perror("fopen");

exit(-1);

}

memset(buf,0,sizeof(buf));

fwrite("12345",1,5,fp);

fseek( fp,0, SEEK_SET );

fread(buf,1,5,fp);

printf("%s\n",buf);

fclose(fp);return 0;

}

linux 文件io实例代码,linux 文件IO(示例代码)相关推荐

  1. java学习 类变量 类方法_这篇文章主要介绍了JAVA类变量及类方法代码实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下类变量(...

    这篇文章主要介绍了JAVA类变量及类方法代码实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 类变量(static) 类变量是该类的所有对象共 ...

  2. python写文件读文件-Python 实例:读写文件

    原标题:Python 实例:读写文件 读写文件是最常见的IO操作.内置了读写文件的函数,用法和的读写文件非常类似.在磁盘上读写文件的功能都是由提供的,现代不允许普通的程序直接操作磁盘,所以,读写文件就 ...

  3. 基于RHEL8的Linux基础入门学习总结笔记(附示例代码)

    Linux简单介绍 特性 完全开源 多用户多任务系统 继承了UNIX多用户多任务的设计理念,允许多人同时上线工作,合理分配资源. 安全稳定高效 严格的用户权限管理使不同使用者之间保持高度的保密性和安全 ...

  4. linux ksh 用户名,实例讲解Linux中ksh的用法

    实例讲解Linux中ksh的用法 发布时间:2008-02-18 20:46:01来源:红联作者:Modegle 熟悉Linux的朋友肯定都知道bash,它是Linux默认的命令行解释程序,熟悉Sol ...

  5. java远程关机_通过jsch实现对linux服务器的shell客户端远程控制关机完整示例代码分享...

    一.前言 由于前些阵子想找个ssh客户端 for android实现在手机上可以远程控制Centos服务器实现在手机上远程关机操作,找了一圈没有合适的,因此自己想通过linux的客户端接入包jsch实 ...

  6. oracle的.aud文件,OracleASM实例的aud文件问题

    在Oracle 10g数据库服务器上,$ORACLE_HOME/rdbms/audit目录下,生成了大量的以aud为扩展名的文件.查看一下日志文件内容,记录的 在Oracle 10g数据库服务器上,$ ...

  7. linux 怎么看当前时间,Linux 查看当前时间和修改系统时间(示例代码)

    一.查看和修改Linux的时区 1. 查看当前时区 命令: date -R 2. 修改设置Linux服务器时区 方法 A 命令 : tzselect 方法 B 仅限于RedHat Linux 和 Ce ...

  8. php分页实例下载,PHP文件操作实例总结【文件上传、下载、分页】

    本文实例讲述了PHP文件操作.分享给大家供大家参考,具体如下: 1.文件上传 上传域: input type="file" 普通文本框(text.password.textarea ...

  9. python对文件操作实例_Python对文件文件夹的操作实例

    代码背景: 最近老看视频教程,我需要知道一部教程,需要多久能看完.win下文件夹里,多选视频文件,可以直接在属性中查看一共需要的时间.不过在网上下载的很多视频教程每一章都分布在不同的文件夹下,无法快捷 ...

  10. Html读取本地文件夹下图片并显示的示例代码

    一 目的 在Html上选择本地文件夹,自动读取文件夹及子文件夹下的所有图片并显示在页面. 技术分析: 存在问题 Html中file标签获取到的路径时相对的. Html中Img指定源时需要的是绝对路径. ...

最新文章

  1. debian配置集锦
  2. VS2010中文注释带红色下划线的解决方法
  3. Jquery跨域请求php数据(jsonp)
  4. JAVA中的位运算符
  5. 调整home和根分区大小
  6. JAVA CLASS混淆工具:ProGuard简单试用
  7. 【上传文件至服务器】
  8. python三菱fx3u通讯mx_[实例]三菱FX3U-485无协议通讯程序(含程序段)
  9. 推荐一个微软知识库(Microsoft Knowledge Base)订阅
  10. 怎么用photoshop抠图,得到透明图片,填充颜色,得到一个程序透明图标
  11. 150. Evaluate Reverse Polish Notation逆波兰表达式
  12. Python实现奇数阶幻方(不用numpy)
  13. 微信语音能保存多久服务器,微信语音播放失败?可能是这几个原因导致的,看完你就懂了...
  14. iOS 音频播放,录音,视频播放,拍照,视频录制
  15. English Learning - L2 语音作业打卡 辅音舌齿龈音 [t] [d] Day24 2023.3.16 周四
  16. linux lsof命令和ps的,Linux 中lsof 命令的使用
  17. ctr 平滑_广告计算——平滑CTR
  18. redis主从复制,主读不到从节点信息的坑
  19. vue 外部字体图标使用,无须绝对路径引入办法
  20. 一个懒惰的人的自省书——请朋友们以我为戒,有更好的未来

热门文章

  1. 干货 | 神经网络与深度学习精选文章汇总
  2. SQL Server2000 未公开的存储过程
  3. ubuntu常见指令
  4. 关于汇编跟C/C++已经java的内存理解
  5. jdk动态代理与cglib动态代理--InvocationHandler--MethodInterceptor
  6. LIVE555再学习 -- testRTSPClient 实例
  7. leetcode-合并两个有序链表
  8. linux文件的特殊权限,Linux系统文件的默认权限和特殊权限
  9. 揭开知识库问答KB-QA的面纱1·简介篇
  10. FileProvider 在 Android N 上的应用