访问操作系统中的对象

访问操作系统中的对象

2025 南京大学《操作系统原理》
访问操作系统中的对象

文件和设备

文件:有 “名字” 的数据对象

  • 字节流 (终端,random)
  • 字节序列 (普通文件)

文件描述符

  • 指向操作系统对象的 “指针”
    • Everything is a file
    • 通过指针可以访问 “一切”
  • 对象的访问都需要指针
    • open, close, read/write (解引用), lseek (指针内赋值/运算), dup (指针间赋值)
2025 南京大学《操作系统原理》
访问操作系统中的对象

文件描述符:访问文件的 “指针”

  • open
    • p = malloc(sizeof(FileDescriptor));
  • close
    • delete(p);
  • read/write
    • *(p.data++);
  • lseek
    • p.data += offset;
  • dup
    • q = p;
2025 南京大学《操作系统原理》
访问操作系统中的对象

文件描述符的分配

总是分配最小的未使用描述符

  • 0, 1, 2 是标准输入、输出和错误
  • 新打开的文件从 3 开始分配
    • 文件描述符是进程文件描述符表的索引
    • 关闭文件后,该描述符号可以被重新分配

进程能打开多少文件?

  • ulimit -n (进程限制)
  • sysctl fs.file-max (系统限制)
2025 南京大学《操作系统原理》
访问操作系统中的对象

文件描述符中的 offset

文件描述符是 “进程状态的” 的一部分

  • 保存在操作系统中;程序只能通过整数编号访问
  • 文件描述符自带一个 offset

Quiz: fork() 和 dup() 之后,文件描述符共享 offset 吗?

  • 这就是 fork() 看似优雅,实际复杂的地方
2025 南京大学《操作系统原理》
访问操作系统中的对象

Windows 中的文件描述符

Handle (把手;握把;把柄)

  • 比 file descriptor 更像 “指针”
  • 你有一个 “handle” 在我手上,我就可以更好地控制你

center

2025 南京大学《操作系统原理》
访问操作系统中的对象

句柄 (柄 = 握把)

center

2025 南京大学《操作系统原理》
访问操作系统中的对象

Windows 的进程创建

面向工程的设计

  • 默认 handle 是不继承的 (和 UNIX 默认继承相反)
    • 可以在创建时设置 bInheritHandles,或者运行时修改
    • “最小权限原则”
  • lpStartupInfo 用于配置 stdin, stdout, stderr

Linux 引入了 O_CLOEXEC

  • fcntl(fd, F_SETFD, FD_CLOEXEC)
2025 南京大学《操作系统原理》