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项目环境切换的几种实现方式

《python项目环境切换的几种实现方式》本文主要介绍了python项目环境切换的几种实现方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 如何在不同python项目中,安装不同的依赖2. 如何切换到不同项目的工作空间3.创建项目

C++多线程开发环境配置方法

《C++多线程开发环境配置方法》文章详细介绍了如何在Windows上安装MinGW-w64和VSCode,并配置环境变量和编译任务,使用VSCode创建一个C++多线程测试项目,并通过配置tasks.... 目录下载安装 MinGW-w64下载安装VS code创建测试项目配置编译任务创建 tasks.js

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

Nginx搭建前端本地预览环境的完整步骤教学

《Nginx搭建前端本地预览环境的完整步骤教学》这篇文章主要为大家详细介绍了Nginx搭建前端本地预览环境的完整步骤教学,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录项目目录结构核心配置文件:nginx.conf脚本化操作:nginx.shnpm 脚本集成总结:对前端的意义很多

通过Docker容器部署Python环境的全流程

《通过Docker容器部署Python环境的全流程》在现代化开发流程中,Docker因其轻量化、环境隔离和跨平台一致性的特性,已成为部署Python应用的标准工具,本文将详细演示如何通过Docker容... 目录引言一、docker与python的协同优势二、核心步骤详解三、进阶配置技巧四、生产环境最佳实践

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键