Linux ls-al命令实现,tree命令实现,不带缓存的文件IO(open,read,write)

shell命令

ls -al  实现

#include <43func.h>
void error_check(int ret, const char *msg) {if (ret == -1) {perror(msg);exit(EXIT_FAILURE);}
}char get_file_type(mode_t mode) {if (S_ISREG(mode)) return '-';//检查给定的文件模式(通常是从 stat 或 lstat 系统调用中获得的)是否表示一个常规文件(regular file)if (S_ISDIR(mode)) return 'd';//检查给定的文件模式(通常是从 stat 或 lstat 系统调用中获得的)是否表示一个目录if (S_ISCHR(mode)) return 'c';//字符设备(character device)if (S_ISBLK(mode)) return 'b';//块设备(block device)if (S_ISFIFO(mode)) return 'p';// FIFO(First In First Out,先进先出)文件,也称为命名管道(named pipe)。if (S_ISLNK(mode)) return 'l';//符号链接(symbolic link),也称为软链接if (S_ISSOCK(mode)) return 's';//套接字(socket)文件return '?';
}char * get_permissions(mode_t mode) {static char permissions[10];strcpy(permissions, "rwxrwxrwx");permissions[9] = '\0';for (int i = 0; i < 9; ++i) {if (!(mode & (1 << (8 - i)))) {//把权限位从后往前移,i=0,把1左移八位,0代表true,1代表flase;permissions[i] = '-';}}return permissions;
}int main(int argc, char *argv[]) {ARGS_CHECK(argc,2);DIR *dirp = opendir(argv[1]);ERROR_CHECK(dirp,NULL,"opendir");int ret = chdir(argv[1]);文件名只有在当前目录下才是路径,改变工作路径ERROR_CHECK(ret,-1,"chdir");struct dirent *pdirent;struct stat statbuf;while ((pdirent = readdir(dirp)) != NULL) {ret = stat(pdirent->d_name, &statbuf);//文件名只有在当前目录下才是路径ERROR_CHECK(stat,-1,"stat");char file_type = get_file_type(statbuf.st_mode);char *permissions = get_permissions(statbuf.st_mode);struct passwd *pw = getpwuid(statbuf.st_uid);//getpwuid 函数用于根据给定的用户ID(UID)检索用户信息struct group *gr = getgrgid(statbuf.st_gid);//getgrgid 函数用于根据给定的组ID(GID)检索组信息char mtime[20];strftime(mtime, 20, "%b %d %H:%M", localtime(&statbuf.st_mtime));printf("%c%s %ld %s %s %8ld %s %s\n",file_type, permissions, statbuf.st_nlink,pw ? pw->pw_name : "unknown", gr ? gr->gr_name : "unknown",(long) statbuf.st_size, mtime, pdirent->d_name);}closedir(dirp);return 0;
}

stat配合目录流(目录流==链表加指针链表结点目录项dirent)

opendir,closedir,readdir。

const char *restrict pathname:路径(文件名和路径不完全对等,(文件名在当前目录下才对等))

struct stat *restrict statbuf:被调函数通过传入传出参数给主调函数传递信息。

传递信息优先用传入传出参数,返回值用于报错。


文件类型和权限     硬链接数 所有者用户ID 用户组ID  文件大小 最后修改时间 (名字(dirent))


文件类型:

权限:


查找用户名

getpwuid:

        struct passwd *pw = getpwuid(statbuf.st_uid);//getpwuid 函数用于根据给定的用户ID(UID)检索用户信息

        struct group *gr = getgrgid(statbuf.st_gid);//getgrgid 函数用于根据给定的组ID(GID)检索组信息


用户组名:

/etc/group:


日历时间:

把计算机时间转换为日历时间。

用time_t获取时间,


返回标准日历时间(带有换行的字符串)


格林威治时间:


本地时间:


 tree 命令的实现:

深度优先遍历,栈或递归;优先采用递归(广度优先遍历用队列)

递归(大问题->小问题->找到最小问题)

大树->访问根,访问所有子树,叶子结点->访问根,没有孩子直接返回。


不带缓冲的文件IO(直接调用内核,不用用户态):

读文件用文件流,用到用户态和系统调用:

内核有一个struct file(文件对象),里面有一个内核文件缓冲区;

在struct file 中读写数据--逻辑上直接操作硬件

数组里面存地址的指针,用户通过访问数组下标来访问指针地址(实现不给用户直接访问硬件资源的功能)

 文件描述符(file descriptor):非负整数,用来访问某个具体的文件对象。(类似于上面数组的下标),默认数组下标0,1,2分别是stdin,stdout,stderr。

ll /dev :

open:

字符串:路径,flages(int类型32bit)

每一个属性都是某一位为1其余位为0,多个独立属性共存用或(|

常见的文件描述符(umaskflages(int类型32bit):(flag的选择)

将默认权限中的特定位关闭,以提高系统的安全性

打开方式必须三选一。三种打开方式彼此互斥。

如果存在O_CREAT,就要使用三参数版本的open。


  1. 标准输入(stdin):文件描述符为0。这通常是键盘输入或者从其他进程通过管道(pipe)或重定向(redirection)传递过来的数据。

  2. 标准输出(stdout):文件描述符为1。这是程序用于输出信息的地方,通常默认是终端(命令行界面)或者写入到文件中。

  3. 标准错误(stderr):文件描述符为2。与标准输出类似,但是用于输出错误信息。这样,在编写程序时,可以将正常的输出和错误输出分别处理,比如分别重定向到不同的文件或管道。

在程序启动之后,如果它打开新的文件、套接字(socket)或其他类型的I/O资源,那么将会使用更高的文件描述符编号,通常是从3开始递增。这些额外的文件描述符由操作系统内核分配和管理,以确保每个打开的文件或资源都有一个唯一的标识。

fd ,文件描述符会选择最小可用的,当stdin,stdout,stderr占用了该012三位后testFile的文件描述符变为3.

O_RDONLY

O_WRONLY

O_RDWR

使用chmod u-r testFile 移除testFile的用户对读权限后,再使用open的读写方式打开会出现权限拒绝许可的提示。


umask码(掩码)

O_CREAT

umask 命令在 Linux 和 Unix 系统中用于设置用户文件创建时的默认权限掩码。这个掩码决定了新创建的文件或目录的初始权限。具体来说,umask 决定了哪些权限会被从默认权限中“剥夺”或“屏蔽”掉。

计算实际权限

当创建新文件或目录时,系统会使用默认的权限减去 umask 掩码来确定新文件或目录的初始权限。例如,如果默认的文件权限是 0666,并且 umask 设置为 022,则新文件的实际权限将是 0666 - 022 = 0644(即 rw-r--r--)。

当 flags 参数中包含了 O_CREAT 时,open 函数的第三个参数就变得有意义了。这个参数是文件权限,用于指定新创建文件的权限。

创建文件的行为总是收到umask码的影响,

成功返回一个文件描述符;失败返回-1;


O_EXCL 确保创建新的文件


O_TRUNC 清空文件内容,如果文件存在则将文件的长度截至0

fopen底层是调用了open的属性;


读写文件

read

文件对象中的指针数组通过文件描述符指向文件对象,读操作通过文件描述符取到文件对象存入缓冲内存buf中。所以buf是传入传出参数;count 表示多少个字节;

echo -n : 不在输出的末尾添加一个换行符 

echo -n 0 > file :向file文件末尾添加0,不换行

od -h   file     :显示file的十六进制

vim编辑器中使用:%!xxd   显示16进制;

文本文件:底层是ASCII码的序列,以字符串形式读写

二进制文件:底层不是ASCII的序列

(文件怎么写就怎么读)

int main(int argc, char *argv[]) {  
//     ARGS_CHECK(argc, 2);  //     int fd = open(argv[1], O_RDWR | O_CREAT, S_IRUSR | S_IWUSR); // 添加O_CREAT和权限  
//     ERROR_CHECK(fd, -1, "open");  //     printf("fd = %d\n", fd);  //     char buf[10];  
//     ssize_t bytesRead = read(fd, buf, sizeof(buf) - 1); // 读取时留一个位置给'\0'  
//     if (bytesRead == -1) {  
//         perror("read");  
//         exit(EXIT_FAILURE);  
//     }  
//     buf[bytesRead] = '\0'; // 确保buf是一个有效的C字符串  
//     puts(buf);  //     close(fd);  //     return 0;  
// }
read的返回值:

>0 :成功读取了字符数;小于等于count;

=0:EOF;

-1: 报错;

count 是申请内存的大小;read之前清空buf;


write

写入文本数据;

 

写入二进制数据:读取二进制数据

读写二进制文档所需要的空间比读取文本文档所需要的空间小,这主要是由于二进制和文本文件在存储和表示数据时的差异

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/31140.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux——ansible中handlers

理解 1.按照已有的剧本写法 如果要完成下面这些操作&#xff1a; 1&#xff09;安装软件包&#xff1a;mysql&#xff0c;httpd&#xff0c;mysql-server&#xff0c;php 2&#xff09;复制配置文件&#xff1a;web&#xff0c;db&#xff0c;php 3&#xff09;后续追加配置文…

数据结构—排序、查找、图论和字符串算法之Java实例

一&#xff1a;引言 在编程的海洋中&#xff0c;算法是程序员的灵魂之光。它们不仅指引着代码的前进方向&#xff0c;更能解决难题&#xff0c;提升效率。虽然各式各样的算法琳琅满目&#xff0c;但其中有一些却是每位程序员必定会遇到且应当深刻掌握的。本文将带您走进这些至…

一个简单好用安全的开源交互审计系统,支持SSH,Telnet,Kubernetes协议

前言 在当今的企业网络环境中&#xff0c;远程访问和交互审计成为了保障网络安-全的重要组成部分。然而&#xff0c;现有的解-决方案往往存在一些痛点&#xff0c;如复杂的配置、有限的协议支持、以及审计功能的不足。这些问题不仅增加了IT管理员的负担&#xff0c;也为企业的…

【arm扩容】docker load -i tar包 空间不足

背景&#xff1a; 首先我在/home/nvidia/work下导入了一些镜像源码tar包。然后逐个load进去。当我 load -i dev-aarch64-18.04-20210423_2000.tar包的时候&#xff0c;出现 Error processing tar file(exit status 1): write /9818cf5a7cbd5a828600d9a4d4e62185a7067e2a6f2ee…

聚合函数和开窗函数中order by结合使用时,窗口区间不是完整区间

hive踩坑笔记 —— 开窗函数为聚合函数时&#xff0c;加order by 与不加 order by的区别_order by sum举例子-CSDN博客 文章中说&#xff0c;混用时窗口区间等价于 rows between unbounded preceding and current row &#xff0c;测试时表象与此描述不一致&#xff0c;如max&a…

【每日刷题】Day71

【每日刷题】Day71 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 牛群分隔 2. 912. 排序数组 - 力扣&#xff08;LeetCode&#xff09; 3. 791. 自定义字符串排序 -…

C语言 | Leetcode C语言题解之第169题多数元素

题目&#xff1a; 题解&#xff1a; int majorityElement(int* nums, int numsSize) {int ans 0;for (int i 0, cnts 0; i < numsSize; i) {if (nums[i] ans) {cnts;} else if (cnts 0) {ans nums[i];} else {cnts--;}}return ans; }

数据结构经典面试之数组——C#和C++篇

文章目录 1. 数组的基本概念与功能2. C#数组创建数组访问数组元素修改数组元素数组排序 3. C数组创建数组访问数组元素修改数组元素数组排序 4. 数组的实际应用与性能优化5. C#数组示例6. C数组示例总结 数组是编程中常用的数据结构之一&#xff0c;它用于存储一系列相同类型的…

基于.NET开源跨平台的文档管理系统

前言 今天大姚给大家分享一款基于.NET8开源&#xff08;MIT License&#xff09;、免费、跨平台的文档管理系统&#xff1a;Dorisoy.Pan。 官方项目介绍 Dorisoy.Pan是一款基于.NET8开源&#xff08;MIT License&#xff09;、免费、跨平台文档管理系统&#xff0c;使用MS S…

使用Python进行Web开发:从基础到实战

使用Python进行Web开发:从基础到实战 Python不仅是一门数据科学的利器,也是一门强大的Web开发语言。得益于其简洁的语法和丰富的生态系统,Python在Web开发领域同样大放异彩。本文将介绍Python在Web开发中的基础知识、常用框架以及一个完整的实战项目,帮助读者从基础入门到…

CDP问卷的目的是什么?CDP问卷对企业有什么好处

CDP问卷&#xff08;Carbon Disclosure Project问卷&#xff09;的目的是多方面的&#xff0c;主要包括以下几点&#xff1a; 推动透明度&#xff1a;CDP问卷要求企业公开披露其温室气体排放数据、减排目标和行动&#xff0c;以及气候风险管理策略等信息。这有助于增强企业的透…

字符串逆序(递归实现)

目录 代码要求 代码实现 代码逻辑 逆序字符串&#xff0c;不使用递归实现&#xff08;推荐&#xff09; 代码要求 编写一个函数reverse_string(char* string) &#xff08;递归实现&#xff09;实现&#xff1a;将参数字符串中的字符反向排列&#xff0c;不是逆序打印要求&…

并发锁机制

JDK1.6 synchronized &#xff08;底层是由C实现的&#xff09;&#xff1a; synchronized: 互斥锁&#xff0c;悲观 锁&#xff0c;同步锁&#xff0c;重量级锁&#xff08;耗性能&#xff09;&#xff0c;多线程使用重量级锁很容易发生线程阻塞&#xff0c;因为涉及到多个线程…

华为数通——OSPF

正掩码&#xff1a;/24 255.255.255.0 反掩码&#xff1a; 255.255.255.255 -255.-255.-255.0 0.0.0.255 例如掩码&#xff1a;255.255.252.0 反掩码&#xff1a;0.0.3.255 在反掩码里面&#xff0c;0 bit 表示精确匹配&#xff0c;1…

养车小程序系统源码,汽修源码,仿途虎养车系统源码,车辆保养小程序系统

用户端&#xff0b;商家端&#xff0b;师傅端 功能介绍: 支持下单上门服务、到店核销&#xff0c;支持单独选择项目、 也支持选择服务人员、和选择门店多种下单方式&#xff0c; 支持上门服务和到店核销两种服务方式&#xff0c;支持自营和多商家联营两种运营模式&#xff…

uni-app中的css3选择器使用

2.给 view 添加样式 .box view{ font-size: 40upx; color: #8A6DE9; } 3.想改变某一个view 样式 .box>view:nth-child(1){ background: #09BB07; } .box>view:nth-child(2){ background: red; } .box>view:nth-child(3){ background: yellow; } 注意&am…

curl命令使用

curl http://localhost/action.php -I curl http://localhost/action.php -X HEAD multipart/form-data 形式的 form 上传文件 curl -F "filename/home/test/file.tar.gz" http://localhost/action.php 用 -d 参数&#xff0c;这时curl会以application/x-www-url-e…

【投稿优惠|稳定出版】2024年体育、健康与食品安全国际学术会议(ICSHFS 2024)

【投稿优惠|稳定出版】2024年体育、健康与食品安全国际学术会议&#xff08;ICSHFS 2024&#xff09; 2024 International Conference on Sports, Health, and Food Safety(ICSHFS 2024) 会议简介&#xff1a; 2024年体育、健康与食品安全国际学术会议&#xff08;ICSHFS 2024…

Linux bash: /usr/local/gcc/bin/gcc: 不是目录

ln -s /usr/local/bin/gcc /usr/bin/gcc ln -s /usr/local/bin/g /usr/bin/g 创建的软连接不生效 问题&#xff1a; [rootdev003 local]# gcc -v bash: /usr/local/gcc/bin/gcc: 不是目录 或者 [rootdev003 local]# gcc -v bash: /usr/local/bin/gcc: 没有那个文件或目录 解决&…

Java项目学习(员工管理)

新增、员工列表、编辑员工整体代码流程与登录基本一致。 1、新增员工 RestController RequestMapping("/admin/employee")EmployeeController 类中使用了注解 RestController 用于构建 RESTful 风格的 API&#xff0c;其中每个方法的返回值会直接序列化为 JSON 或…