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

相关文章

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

python获取cmd环境变量值的实现代码

《python获取cmd环境变量值的实现代码》:本文主要介绍在Python中获取命令行(cmd)环境变量的值,可以使用标准库中的os模块,需要的朋友可以参考下... 前言全局说明在执行py过程中,总要使用到系统环境变量一、说明1.1 环境:Windows 11 家庭版 24H2 26100.4061

pytest+allure环境搭建+自动化实践过程

《pytest+allure环境搭建+自动化实践过程》:本文主要介绍pytest+allure环境搭建+自动化实践过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、pytest下载安装1.1、安装pytest1.2、检测是否安装成功二、allure下载安装2.

VS配置好Qt环境之后但无法打开ui界面的问题解决

《VS配置好Qt环境之后但无法打开ui界面的问题解决》本文主要介绍了VS配置好Qt环境之后但无法打开ui界面的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目UKeLvb录找到Qt安装目录中designer.UKeLvBexe的路径找到vs中的解决方案资源

SpringBoot实现多环境配置文件切换

《SpringBoot实现多环境配置文件切换》这篇文章主要为大家详细介绍了如何使用SpringBoot实现多环境配置文件切换功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 示例代码结构2. pom文件3. application文件4. application-dev文

Web技术与Nginx网站环境部署教程

《Web技术与Nginx网站环境部署教程》:本文主要介绍Web技术与Nginx网站环境部署教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Web基础1.域名系统DNS2.Hosts文件3.DNS4.域名注册二.网页与html1.网页概述2.HTML概述3.

Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题

《Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题》:本文主要介绍Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录一、前言二、系统架构检测三、卸载旧版 Go四、下载并安装正确版本五、配置环境变量六、验证安装七、常见

Python 异步编程 asyncio简介及基本用法

《Python异步编程asyncio简介及基本用法》asyncio是Python的一个库,用于编写并发代码,使用协程、任务和Futures来处理I/O密集型和高延迟操作,本文给大家介绍Python... 目录1、asyncio是什么IO密集型任务特征2、怎么用1、基本用法2、关键字 async1、async

Gradle下如何搭建SpringCloud分布式环境

《Gradle下如何搭建SpringCloud分布式环境》:本文主要介绍Gradle下如何搭建SpringCloud分布式环境问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Gradle下搭建SpringCloud分布式环境1.idea配置好gradle2.创建一个空的gr

Android开发环境配置避坑指南

《Android开发环境配置避坑指南》本文主要介绍了Android开发环境配置过程中遇到的问题及解决方案,包括VPN注意事项、工具版本统一、Gerrit邮箱配置、Git拉取和提交代码、MergevsR... 目录网络环境:VPN 注意事项工具版本统一:android Studio & JDKGerrit的邮