当前位置: 首页 > article >正文

文件fd内容

操作文件,先创建一个文件指针,FILE* fp
fopen(“A”, “B”) - - - 打开文件A,用B方法打开,B的选项有:
w - 写方式:如果打开的文件不存在,则在当前路径下新建指定的文件,w默认打开文件的时候就会把文件清空。
a - 追加:每次打开文件并追加(appending)内容,不清空内容。
echo “nihao” > log.txt - - - 每次写入文件内容都是新的,都是先清空再写入。> 也就是文件的w操作,可新建或清空
echo “nihao” >> log.txt - - - 相当于 a 方式给文件中追加信息。
fclose(fp) - - - 利用文件指针关闭文件
perror(“fopen”) - - - 如果打开失败,利用这个函数返回打开错误的信息。
fprintf(FILE* fp, const char* format, …) - - - 把指定的内容写入文件指针fp所指向的文件中。
打开文件是进程在打开文件,每一个被打开的文件,在OS中一定存在对应的描述文件属性的结构,类似于PCB。
文件 = 属性 + 内容,只要存在一个文件,就会占据空间,不论文件中有没有内容。

操作文件本质是进程在操作。
文件在磁盘上,磁盘是硬件,向文件写入本质是向硬件中写入,而硬件的管理者是操作系统,用户没有权利直接写入,因此得通过操作系统写入,所以存在系统调用接口。因此 c 中fopen等函数都是对系统调用接口的封装。
系统调用接口:
flags - - - 想怎样创建文件,是一个整数,但可以传递很多标记位。
pathname - - - 可以带路径写上文件名,也可以不带路径。
open 失败返回-1,成功返回文件描述符 也是整形。
open 带两个参数的一般是操作已经存在的文件
open 带三个参数的,就是多写一个文件的权限,一般是文件如果不存在用三个参数的。
open 的第三个参数给的权限一般会和系统默认权限umask结合后再设置文件权限,如果不想结合系统的umask,可以手动调用umask(0),直接把当前进程的系统默认权限掩码改成 0,这样就不会影响open第三个参数给的权限。
write 把指定的buf的信息,有count大小,写到 fd 所对应的文件中。

man 2 open
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags); //带两个参数的一般是操作已经存在的文件
int open(const char *pathname, int flags, mode_t mode);//一般是文件如果不存在用三个参数的

#include <unistd.h> 
int close(int fd);
ssize_t write(int fd, const void *buf, size_t count);

man 2 umask
 #include <sys/types.h>
#include <sys/stat.h>
mode_t umask(mode_t mask);

flags - - - 就是标志位的传递,看着是一个整数,但其实是一个位图。
O_RDONLY: 只读打开
O_WRONLY: 只写打开
O_RDWR : 读,写打开
这三个常量,必须指定一个且只能指定一个
O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限
O_APPEND: 追加写
O_TRUNC : 写入打开的时候,如果文件存在,重新写入的话就清空
在这里插入图片描述

文件描述符 0/1/2
0 :标准输入 键盘 - - stdin
1 :标准输出 显示器 - - stdout
2 :标准错误 显示器 - - stderr
在这里插入图片描述

文件描述符的本质是:内核中进程对应的文件描述结构体内的指向文件链表的数组的下标。
首先,进程的PCB中会有一个描述文件的结构体 files ,
结构体 files 中存有指向文件属性信息列表的数组
文件属性信息列表会开辟一个文件内核级缓存
无论读写文件,都是把文件内容加载到文件内核级的缓冲区中。对文件内容的操作都是在缓冲区中操作,最后通过缓存进行刷新磁盘内容。
open 就是在创建 file,开辟文件缓冲区,查看进程文件描述符表,把file地址填写进文件数组中,返回数组下标。
在这里插入图片描述

linux 中一切皆文件
对于任何IO设备,都有 struct file 可以访问它,struct file 访问不同的设备,这种技术就是多态。struct file 就是存放IO设备的属性和方法。
再OS中,访问文件只认文件描述符。在C语言中,fopen,fclose等函数都是库函数,返回的FILE类型是一个 c 语言的结构体,这个FILE 结构体中肯定存有 fd (文件描述符)。可以查看(stdin stdout stderr 也是FILE类型的):
在这里插入图片描述

下面演示一个从一个窗口给另一个窗口输入东西:
linux一切皆文件,则窗口也可以看作是一个文件,找到文件信息,则可以利用open、write函数写:
在这里插入图片描述


http://www.kler.cn/a/393419.html

相关文章:

  • 【解决报错】AttributeError: ‘NoneType‘ object has no attribute ‘group‘
  • 【联动】【MSS】【AF】
  • flask基础
  • stm32定时器输出比较----驱动步进电机
  • SpringBoot简单使用Stomp
  • mapbox基础,加载mapbox官方地图
  • 洛谷 P3043 [USACO12JAN] Bovine Alliance G
  • Python练习19
  • Nginx中使用keepalive实现保持上游长连接实现提高吞吐量示例与测试
  • 如何为 SeaTunnel 配置 MySQL 用户并授予权限
  • 实景三维赋能智慧公安建设
  • sol机器人pump机器人如何实现盈利的?什么是Pump 扫链机器人?
  • 爬虫补环境案例---问财网(rpc,jsdom,代理,selenium)
  • ODOO学习笔记(8):模块化架构的优势
  • Java与HTML:构建静态网页
  • 提取神经网络数学表达式
  • 机器学习 ---模型评估、选择与验证(1)
  • 大数据治理:从概念到实践的旅程
  • 8. 基于 Redis 实现限流
  • 鸿蒙next版开发:ArkTS组件通用属性(组件标识)
  • vue计算属性 初步使用案例
  • 当下中小微企业该不该跟风「大模型热潮」?
  • 信创防泄露是什么?如何实现信创防泄露?
  • PVE纵览-Proxmox VE SDN入门指南:构建灵活的虚拟网络
  • 网站架构知识之Ansible进阶(day022)
  • 【网络工程】计算机硬件概述