访问操作系统中的对象
访问操作系统中的对象
访问操作系统中的对象
文件和设备
文件:有 “名字” 的数据对象
字节流 (终端,random)
字节序列 (普通文件)
文件描述符
指向操作系统对象的 “指针”
Everything is a file
通过指针可以访问 “一切”
对象的访问都需要指针
open, close, read/write (解引用), lseek (指针内赋值/运算), dup (指针间赋值)
访问操作系统中的对象
文件描述符:访问文件的 “指针”
open
p = malloc(sizeof(FileDescriptor));
close
delete(p);
read/write
*(p.data++);
lseek
p.data += offset;
dup
q = p;
访问操作系统中的对象
文件描述符的分配
总是分配最小的未使用描述符
0, 1, 2 是标准输入、输出和错误
新打开的文件从 3 开始分配
文件描述符是进程文件描述符表的索引
关闭文件后,该描述符号可以被重新分配
进程能打开多少文件?
ulimit -n (进程限制)
sysctl fs.file-max (系统限制)
访问操作系统中的对象
文件描述符中的 offset
文件描述符是 “进程状态的” 的一部分
保存在操作系统中;程序只能通过整数编号访问
文件描述符自带一个 offset
Quiz: fork() 和 dup() 之后,文件描述符共享 offset 吗?
这就是 fork() 看似优雅,实际复杂的地方
访问操作系统中的对象
Windows 中的文件描述符
Handle (把手;握把;把柄)
比 file descriptor 更像 “指针”
你有一个 “handle” 在我手上,我就可以更好地控制你
访问操作系统中的对象
句柄 (柄 = 握把)
访问操作系统中的对象
Windows 的进程创建
面向工程的设计
默认 handle 是
不继承
的 (和 UNIX 默认继承相反)
可以在创建时设置 bInheritHandles,或者运行时修改
“最小权限原则”
lpStartupInfo 用于配置 stdin, stdout, stderr
Linux 引入了 O_CLOEXEC
fcntl(fd, F_SETFD, FD_CLOEXEC)