文件IO编程

在Linux中为了简化系统对不同设备的处理,提高效率,对目录和设备的操作都等同于文件的操作。Linux中的文件主要分为 4 种:普通文件、目录文件、链接文件和设备文件。
两种方式访问文件:
一、系统调用方式:依赖于操作系统
Linux系统调用概念:
是用户程序要使用内核服务时所经历的函数调用,他运行于内核空间。进行系统调用时,程序运行空间需要从用户空间进入内核空间,处理完后再返回用户空间。这是因为用户程序不能访问内核的数据和函数,只能使用用户空间的资源。
系统调用按照功能逻辑大致可分为进程控制、进程间通信、文件系统控制、系统控制、存储管理、网络管理、 socket 控制、用户管理等几类。
用户编程接口API:
我们知道,系统调用是编程过程中为实现程序员的某种“愿望”而存在的。但是必须明确一点,系统调用是在内核态下通过软中断或系统调用指令向内核发出一个明确的请求,内核将调用内核相关函数来实现(如sys_read(),sys_write(),sys_fork())。用户程序不能直接调用这些Sys_read,sys_write等函数。问题到这我们察觉到,程序员要通过某种桥梁来实现系统调用,这种桥梁就是“用户编程接口API”,例如open()、write()等等函数就叫做API接口函数。于是我们大人类就将直接和程序员打交道的这类函数叫做“用户编程接口API”。
系统调用和API之间的关系:

系统调用就是API和系统服务之间的桥梁,但并不是所有的函数都一一对应一个系统调用,有时,一个 API 函数会需要几个系统调用来共同完成函数的功能,甚至还有一些 API 函数不需要调用相应的系统调用(因此它所完成的不是内核提供的服务)。看图说话。

二、库函数调用方式这个概念通过下面的对比就可以知道了。

系统调用和库函数调用的区别:
系统调用依赖于具体的操作系统,不同平台要经过特定的移植,而库函数调用是与操作系统无关的,在任何操作系统下比如windows、vxworks、wince、powerpc、linux下他们的函数都是一模一样的,使用方法也是一模一样,他完全就是独立于具体操作系统平台的一种操作。另一个方面,我们知道每一次系统调用都要进行用户空间和内核空间之间的切换,而且这种切换对CPU的开销很大,如果大量使用系统调用会大大降低CPU的工作效率,如此致命的问题该怎么办呢?这时候“库函数调用”登台啦,他是一种带缓冲区的操作,当用户空间缓冲区满或者写操作结束时,才将用户缓冲区的内容写到内核缓冲区,同样的道理,当内核缓冲区满或写结束时才将内核缓冲区内容写到文件对应的硬件平台,如此一来就大大减少了系统调用的次数,大大提高CPU工作效率。

实验操作:简单文件 I/O 操作
(A)系统调用API方式:
主要用到5个函数:open()、read()、write()、lseek()和close()。
(1)open()函数:打开或创建文件,可指定这个文件的属性和用户权限

所需头文件:#include <sys/types.h>、#include <sys/stat.h>、#include <fcntl.h>

函数原型:int open(const char *pathname, int flags, int perms);

参数解析:pathname:文件路径名,要加双引号,例如:使用绝对路径"/home/clbiao/hello.c",默认前目录下"hello.c"

flags:文件打开的方式。看图。前三个属性标识不能组合࿰

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值