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 Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

Centos环境下Tomcat虚拟主机配置详细教程

《Centos环境下Tomcat虚拟主机配置详细教程》这篇文章主要讲的是在CentOS系统上,如何一步步配置Tomcat的虚拟主机,内容很简单,从目录准备到配置文件修改,再到重启和测试,手把手带你搞定... 目录1. 准备虚拟主机的目录和内容创建目录添加测试文件2. 修改 Tomcat 的 server.X

VSCode配置Anaconda Python环境的实现

《VSCode配置AnacondaPython环境的实现》VisualStudioCode中可以使用Anaconda环境进行Python开发,本文主要介绍了VSCode配置AnacondaPytho... 目录前言一、安装 Visual Studio Code 和 Anaconda二、创建或激活 conda

pytorch+torchvision+python版本对应及环境安装

《pytorch+torchvision+python版本对应及环境安装》本文主要介绍了pytorch+torchvision+python版本对应及环境安装,安装过程中需要注意Numpy版本的降级,... 目录一、版本对应二、安装命令(pip)1. 版本2. 安装全过程3. 命令相关解释参考文章一、版本对

国内环境搭建私有知识问答库踩坑记录(ollama+deepseek+ragflow)

《国内环境搭建私有知识问答库踩坑记录(ollama+deepseek+ragflow)》本文给大家利用deepseek模型搭建私有知识问答库的详细步骤和遇到的问题及解决办法,感兴趣的朋友一起看看吧... 目录1. 第1步大家在安装完ollama后,需要到系统环境变量中添加两个变量2. 第3步 “在cmd中

Windows环境下安装达梦数据库的完整步骤

《Windows环境下安装达梦数据库的完整步骤》达梦数据库的安装大致分为Windows和Linux版本,本文将以dm8企业版Windows_64位环境为例,为大家介绍一下达梦数据库的具体安装步骤吧... 目录环境介绍1 下载解压安装包2 根据安装手册安装2.1 选择语言 时区2.2 安装向导2.3 接受协议

SpringBoot基于沙箱环境实现支付宝支付教程

《SpringBoot基于沙箱环境实现支付宝支付教程》本文介绍了如何使用支付宝沙箱环境进行开发测试,包括沙箱环境的介绍、准备步骤、在SpringBoot项目中结合支付宝沙箱进行支付接口的实现与测试... 目录一、支付宝沙箱环境介绍二、沙箱环境准备2.1 注册入驻支付宝开放平台2.2 配置沙箱环境2.3 沙箱

linux环境openssl、openssh升级流程

《linux环境openssl、openssh升级流程》该文章详细介绍了在Ubuntu22.04系统上升级OpenSSL和OpenSSH的方法,首先,升级OpenSSL的步骤包括下载最新版本、安装编译... 目录一.升级openssl1.官网下载最新版openssl2.安装编译环境3.下载后解压安装4.备份