| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> UNIX环境编程(c语言)--文件I/O-文件共享 -> 正文阅读 |
|
[系统运维]UNIX环境编程(c语言)--文件I/O-文件共享 |
目录基础知识文件描述符是内核为了高效管理已经打开的文件创建的索引,所有打开的文件都通过文件描述符来引用,其值是一个非负整数,当打开或创建一个文件时,内核会向进程返回一个文件描述符,当读或写时,需要使用文件描述符标识你需要操作的文件。 当程序开始运行时,系统会自动打开三个文件描述符 ,如下显示
当然你可以将标准输入 输出 出错重定向 但我们打开一个文件时,系统返回的文件描述符必定是当前最小可用的文件描述符的值,由于0 1 2 都已经被用了,所以第一次调用返回的肯定是3 文件偏移量是当前读取位置到文件开头处计算的字节数,通常是一个非负数(有例外),就相当于标记现在的“光标”在文件的哪个位置,通常读、写等操作都是在当前文件偏移量下进行的。我们在操作前应当确定文件偏移量在哪。 其他有关于文件名、权限、属性等基础知识 文件io打开文件原型
open 和 openat 的区别在于 后者多了一个参数 fd , 其用法如下
参数 path用于指出文件的位置和文件名,只写文件名为当前目录。 参数oflag 是用于指定操作选项,可选择多个选项,用 | (或)连接 必选选项如下,而且下面的只能选一个
还有很多可选选项,以下列出常用的
最后一个参数 …是可变长度的参数,只有创建文件时才有用,用于指定创建文件的权限,用数字设置权限的反思 使用实例 以可读可写方式打开一个文件
打开一个文件,若不存在则创建
判断一个文件是否操作,存在返回-1,不存在则创建
创建文件原型
两个参数和open一致,path表示路径和文件名,mode是指明创建权限 creat只能以只写方式打开创建的文件,如果你希望读文件,只能creat后关闭文件,再重新open 所以 在实际应用在比较少用到creat,在早期open还不能创建文件时才经常使用 现在我们经常用以下命令创建文件
修改文件偏移量原型
参数一,fd ,是文件标识符,通常fd都表示这个
说明 因为文件偏移量有可能是负数,所以测试是否成功,最好测试是否等于-1,而不是测试是否小于0 管道、FIFO、socket不能被设置文件偏移量,lseek时会返回-1 文件偏移量允许大于文件长度,这样子会在文件中形成一个空洞,就是存在一个没有被写过的区域,但是这个区域都会被读为0 使用实例
当前位置后5字节开始写
在文件末位前5字节处
读文件原型
参数二是存放读取数据的内存的地址,一般定义一个char *buf用于存放 说明 但是有如下几种情况
使用实例
写文件原型
参数的定义基本与read一致 但是返回值一般与设置的nbytes一致,否则为出错了 使用实例
关闭文件原型
关闭一个文件也会释放加在该文件上的所有记录锁(以后再谈) 当一个进程结束时,内核会自动关闭它打开的文件 但是还是最好自己写好关闭文件的代码 文件io实例打开test.txt文件,若不存在则创建它,在末尾写入一个字符串,然后读取全部内容
关于实例內的errno报错 但是错误原因是以整数存储在errno中的,对程序员不友好,使用我们使用strerror可以将其转化为字符串形式的错误提醒 文件共享Unix/linux系统支持在不同进程间共享打开文件 io的数据结构内核使用了三种数据结构来表示打开的文件
两个进程打开同一个文件的关系图如下 原子操作原子操作,就是一个不可分的操作,只调用一个函数调用完成,要么一次完成全部操作,要么全部不执行 假如我们写了一个程序,打开一个文件并在文件尾部写入内容,先使用open打开文件,再使用lseek将文件偏移量设置到文件末尾,然后再写 这样子的 程序在只有一个进程时是没有问题的,但是如果有两个以上的进程同时操作一个文件,就会有意想不到的问题,如下 进程a打开文件test,并将文件偏移量设置到了文件末尾,这时内核将进程a挂起,然后进程b运行,也打开了文件test,并在文件末尾写入了内容,等到进程a再次运行写入内容,这时候它写入的位置就不是在末尾了。 问题就在于,在两个函数调用之间,内核有可能临时将进程挂起 如果使用原子操作,就可以避免这样子的问题 函数pread 和 pwrite原型
这两个函数和之前的read和write用法差不多 参数的定义也是一致的 两个函数作用就是,只用了一个原子操作完成了,设置文件偏移量和 读写的操作 其他文件io函数复制文件描述符 :函数dup 和dup2原型
两个函数的作用都是,将新的文件描述符,也指向文件描述符fd指向的文件,两个文件描述符恭喜文件表项(文件状态、文件偏移量一致) 通俗话来说就是,我们打开了文件test,返回的文件描述符为fd,这时我们调用 dup返回的新文件描述符,一定是最小可用文件描述符 常用dup2 来重定向标准输入输出 使用实例
刷新缓存 函数 sync、fsync、fdatasync传统的Unix系统实现在内核设有区缓存和页缓存,大多数io操作都通过缓冲区进行,当我们写入文件时,并不会马上写入文件中,而是先写入在缓冲区中,排入队列,再写入磁盘。 为了保证文件内容的一致性,可以使用刷新缓存的函数调用 原型
sync是将所有修改过的内容都排入写队列,然后就返回,并不等待写磁盘操作完成。 fsync 只对指定的文件起作用,等待写磁盘操作完成,才返回 读取 / 修改文件属性 函数 fcntl可以获取或改变文件的属性
fcntl 的cmd与8种功能,后3种与记录锁有关,暂时不说
使用实例 获取文件标志时,并不能直接获取全部文件标志。如需获取几个必选的文件标志需要需要& O_ACCMODE
修改文件标志时,必须先获取之前文件标志,修改后再写入
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/16 2:15:28- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |