UNIX环境编程-文件纪要

2024-01-12 13:28
文章标签 环境 编程 unix 纪要

本文主要是介绍UNIX环境编程-文件纪要,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

标题

      • 文件描述符
      • 文件的访问权限
      • 粘着位和s权限位
      • 跳过缓存直接落盘
      • IO效率
      • 文件空洞
      • 文件的时间(Unix)
      • IO标准库中的流和缓冲
      • 重要的文件

文件描述符

在这里插入图片描述
fcntl函数中F_GETFD/F_SETFD表示获取或设置文件描述符属性(包括FD_CLOEXEC等);F_GETFL/F_SETFL表示获取或设置文件状态(文件表项中的文件状态标志,包括只读、只写、读写、异步等等)。

注意,当多个进程打开同一个文件时,共享的是V节点信息。

文件的访问权限

在这里插入图片描述

粘着位和s权限位

与进程相关联的ID有6个或6个以上,例举如下重要的几个:

ID说明作用
实际用户ID
实际组ID
实际是谁在操作进程
有效用户ID
有效组ID
附属组ID
用于进程在执行过程中文件访问权限检查(和文件的所属id比较)
保存的设置用户ID
保存的设置组ID
在执行一个程序时可用来设置有效ID(在文件的特定权限位被设置时使用)

当执行一个程序文件时,进程的有效用户/组ID通常就是实际用户/组ID。但是可以通过设置文件的权限位,使得执行此文件时,进程的有效用户ID设置为文件所有者的用户ID。例如,当程序文件的所有者是超级用户时,设置文件的该权限位后,当程序文件被一个进程执行时,该进程具有超级用户的权限。
该权限位也称为s权限位(包括S_ISUID(4000) 和 S_ISGID(2000))。一般只对可执行程序文件设置该权限位。

粘着位,如果对一个目录设置了粘着位,只有对该目录有写权限的用户并且满足以下条件,才能删除目录下的文件:

  • 拥有此文件
  • 拥有此目录
  • 是超级用户

使用chmod +t的方式可以设置目录的粘着位(一般只针对目录设置该权限位)。

跳过缓存直接落盘

传统的UNIX系统设有缓冲区高速缓存或页高速缓存,大多数磁盘IO都是通过缓冲区进行的,当写入文件时,内核会将数据先放到缓存区缓存中,通过延时写的方式落盘。

sync函数主动将缓冲区的缓存数据刷到磁盘中,但是它不等待实际写磁盘结束就返回。
fsync函数只针对特定的文件起作用,并且它会等待数据实际写磁盘结束再返回。

fcntl函数有一个值为O_SYNC的文件状态(可以跳过缓存,一般数据库程序就会用到),使得每次write文件时,都需要等待数据实际写到磁盘上才返回(未设置该状态的情况下write采用的是延时写策略)。

IO效率

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

如何选取一个有效的count值,使得read的效率最大化。通过测试不同的数据,发现在磁盘块大小为4096byte的系统上,count的值为4096或大于4096时IO的效率最大。
大多数系统上为了改善性能都采用了某种预读的技术。当检测到正在顺序读取数据时,系统会试图读入比应用所要求的更多数据,并假想应用很快就能应用到这些数据。

文件空洞

当文件设置的偏移量超过文件的大小,并写入一些数据后,就会造成文件空洞(文件空洞要结合文件在磁盘上存放在不连续的块中来理解)。
在这里插入图片描述
对于空洞处,使用read函数读出来的字节为0。通过 ls -l 命令看到的文件大小是包含空洞的,通过du -s 命令或 wc -c 可以获取文件实际的字节数 。

文件的时间(Unix)

字段说明ls命令例子
st_atim文件数据的最后访问时间-uread
st_mtim文件数据的最后修改时间默认write
st_ctimi节点状态的最后修改时间-cchmod、chown

IO标准库中的流和缓冲

当一个文件流被创建时(fopen),它没有被定向(流的定向决定读、写的字符是单字节还是多字节),此时使用单字节IO函数,则流被定向为单字节流;使用多字节函数,流会被定向为多字节流。

标准IO提供了以下三种类型的缓冲:
(1)全缓冲:只有填满IO缓冲区后才会进行实际的IO操作。
(2)行缓冲:在输入输出中遇到换行符时,会进行实际的IO操作(缓冲区满时也会做IO操作)。
(3)无缓冲:没有缓冲。

重要的文件

文件路径文件作用
/etc/passwd账户信息(用户数据库)
/etc/shadow账户密码(经过加密处理)
/etc/group账户所属组文件(组数据库)
/etc/services记录网络服务器数据文件
/etc/protocols协议信息
/etc/networks网络信息
/etc/resolv.conf域名服务器地址配置文件
/etc/hosts静态主机文件(本地域名数据库)
/etc/services服务名称到端口号得映射关系文件

这篇关于UNIX环境编程-文件纪要的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/598003

相关文章

VScode连接远程Linux服务器环境配置图文教程

《VScode连接远程Linux服务器环境配置图文教程》:本文主要介绍如何安装和配置VSCode,包括安装步骤、环境配置(如汉化包、远程SSH连接)、语言包安装(如C/C++插件)等,文中给出了详... 目录一、安装vscode二、环境配置1.中文汉化包2.安装remote-ssh,用于远程连接2.1安装2

PyCharm接入DeepSeek实现AI编程的操作流程

《PyCharm接入DeepSeek实现AI编程的操作流程》DeepSeek是一家专注于人工智能技术研发的公司,致力于开发高性能、低成本的AI模型,接下来,我们把DeepSeek接入到PyCharm中... 目录引言效果演示创建API key在PyCharm中下载Continue插件配置Continue引言

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

mysql-8.0.30压缩包版安装和配置MySQL环境过程

《mysql-8.0.30压缩包版安装和配置MySQL环境过程》该文章介绍了如何在Windows系统中下载、安装和配置MySQL数据库,包括下载地址、解压文件、创建和配置my.ini文件、设置环境变量... 目录压缩包安装配置下载配置环境变量下载和初始化总结压缩包安装配置下载下载地址:https://d

将Python应用部署到生产环境的小技巧分享

《将Python应用部署到生产环境的小技巧分享》文章主要讲述了在将Python应用程序部署到生产环境之前,需要进行的准备工作和最佳实践,包括心态调整、代码审查、测试覆盖率提升、配置文件优化、日志记录完... 目录部署前夜:从开发到生产的心理准备与检查清单环境搭建:打造稳固的应用运行平台自动化流水线:让部署像

gradle安装和环境配置全过程

《gradle安装和环境配置全过程》本文介绍了如何安装和配置Gradle环境,包括下载Gradle、配置环境变量、测试Gradle以及在IntelliJIDEA中配置Gradle... 目录gradle安装和环境配置1 下载GRADLE2 环境变量配置3 测试gradle4 设置gradle初始化文件5 i

Java汇编源码如何查看环境搭建

《Java汇编源码如何查看环境搭建》:本文主要介绍如何在IntelliJIDEA开发环境中搭建字节码和汇编环境,以便更好地进行代码调优和JVM学习,首先,介绍了如何配置IntelliJIDEA以方... 目录一、简介二、在IDEA开发环境中搭建汇编环境2.1 在IDEA中搭建字节码查看环境2.1.1 搭建步

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

C#反射编程之GetConstructor()方法解读

《C#反射编程之GetConstructor()方法解读》C#中Type类的GetConstructor()方法用于获取指定类型的构造函数,该方法有多个重载版本,可以根据不同的参数获取不同特性的构造函... 目录C# GetConstructor()方法有4个重载以GetConstructor(Type[]

鸿蒙开发搭建flutter适配的开发环境

《鸿蒙开发搭建flutter适配的开发环境》文章详细介绍了在Windows系统上如何创建和运行鸿蒙Flutter项目,包括使用flutterdoctor检测环境、创建项目、编译HAP包以及在真机上运... 目录环境搭建创建运行项目打包项目总结环境搭建1.安装 DevEco Studio NEXT IDE