文件系统 三大部分:

csapp

myls类似ls的实现 ,-l,-a,-i(当前文件的inode),-n;-l与-i 内容最长 区别 id与name的区别 /etc下面的passwd文件 以及group文件;

一、目录和文件 递归

1. 获取文件属性(stat fstat lstat)

state:通过文件路径获取属性,面对符号链接文件时获取的时目标文件的属性 fstate:通过文件描述符获取属性 lstate:面对符号链接文件时获取的是符号链接文件的属性

  • cmd —长格式 -短格式 非选项传参
  • 写myls ls --all = ls -a
  • ls -26a -26A 命令选项 26个字母 26+26+10;
  • 想创建一个-a的文件 不可以直接1. 写成 touch -a; touch — -a; 前面的--表示当前的选项结束。2. 写路径touch tmp/-b`
  • stat get file status;
    • stat 通过名字来做什么事情 填到buf空间;fstate通过文件描述符。。。;lstat 与链接规则?
    • stat 文件名 结构体;stat 命令是由stat函数封装而来

2. 文件访问权限一 2

  • st_mode是一个16位位图。用来表示文件类型 文件访问权限,及特殊权限位(u+s,g+s,t)

3. umask

  • 作用:防止产生权限过松的文件 一 3 4 5 6

4.文件权限更改/管理 两个函数chmod、fchmod

5.粘住位

  • t位

6. 文件系统:FAT(不开源), UFS(unix早期)

  • 文件系统:文件或数据的存储和管理。

7.硬链接、软链接 符号链接

  • 硬链接的特点:与目录项是同义词 且建立硬链接有限制,不能给分区/目录建立,符号链接优点:可跨分区,可以给目录建立
  • link unlink remove rename(mv):改名字或路径,路径相同为改名,不同为改位置

8. 更改文件最后读写的时间 utime

  • 更改 atime 和mtime;(读写)
  • 没有 创建时间!

9.目录的创建和销毁

  • mkdir
  • rmdir(empty否则递归)

10.更改当前工作路径

  • chidr (cd) fchdir 这两个函数·可以突破 chroot 假根技术 假装告诉进程是根目录;安全机制
  • getcwd(pwd) 与ls命令的实现有关
  • 用到的时候:守护进程 u盘 长时间跑的进程 放在根目录

读取目录内容

  • glob():解析模式/通配符

目录流

  • opendir()
  • closedir()
  • readdir()3
  • rewinddir()
  • seekdir()
  • telldir()

二、系统数据文件和信息

  1. /etc/passwd freebsd无该文件 BDB 轻量数据库;HP UNIX fs(26个目录). 标准出来和稀泥:getpwuid()

  2. /etc/group getgrgid(); getgrnam();(类似上面)每个平台不一样 #使用技巧 开不同终端标签页,查man,log,运行界面,文件的打开/写;

  3. /etc/shadow 查看权限 ls -l hash 是混淆不是加密 不可逆 若原串相同 所的串相同 防备管理员坚守自盗 ;加密对应解密。x%5=2,x有无数结果。 加密:安全 :攻击成本大于收益 安全?穷举:口令随机校验防止脚本攻击。

     getspname():
     char *crypt(const char *key,const char *salt): man 一下 在makefile中加入内容 -D XOPEN_SOURCE;加盐。$id$salt$两个要素共用一个参数。    
     getpass()
     
    

    应用密码学 blowfish作者 待查

  4. 时间戳 :time_t char * struct tm time_t 以秒为单位 。计算机喜欢大整数 人类喜欢字符串

date +%s
1758977056
petto@petto-laptop:~$ date
2025年 09月 27日 星期六 20:44:20 CST

不要归为人类… 程序员介于两者之间,喜欢结构体… 三足鼎立


不同类型中切换 time(): 内核 中取时间戳;get time in seconds localtime(); gmtime();格林威治时间 mktime(); strftime();

三、进程环境

  1. main 函数 int main(int argc,char *argv[])以前是三个参数(环境变量)

  2. 进程的终止(一字不差背诵5+3) 正常终止: 从main函数返回 return 0;返回值给父进程看。echo $?打印上一条语句的执行状态。 调用exit man 3 exit 调用_exit或_EXIT 最后一个线程从其启动例程返回 最后一个线程调用pthread_exit 异常终止: 调用abort 接到一个信号并终止 最后一个线程对其取消请求作出响应

    记忆是学习的一种方式
    

    atexit():钩子函数

  3. 命令行参数的分析

  4. 环境变量 本质:key=value,用export查看所有环境变量。把操作系统看成一个正在跑的程序,环境变量相当于它的全局变量。path保存所有二进制文件(shell 外部 磁盘里)路径。 程序员和管理员之间的约定。 environ(char**) getenv(); setenv(); putenv();不好用,参数没有const修饰

  5. c程序的存储空间布局 pmap(1)

  6. 库的概念 动态库 静态库 手工装载库:查看手册的例子。模块。插件。photoshop滤镜库。 void dlopen(const charfilename,int flag);要求的手工装载的库,打开方式,返回指针。 dlclose(); dlerror(); dlsymbol();

  7. 函数跳转 一层一层函数调用,若每一次调用的函数相同,就成了递归。比如说遍历一棵树,只想找到值然后返回,不想一层一层返回出去。 goto语句 不安全

    1. setjump(),设置跳转点
    2. longjump(),从哪一个位置跳回到跳转点。
  8. 资源的获取及控制