1.阻塞分为: 完全阻塞, 不阻塞, 延时阻塞
2.管理操作系统的方式: 1. 轮询,2. 中断
3./dev/tty : 当前终端
5.harddisk 使用block来管理
memory 使用page来管理
6.如果在open一个设备时指定了O_NONBLOCK标志, read/write就不会阻塞,以read为例, 如果设备没有数据到达就返回-1, 同时置errno为EWOULDBLOCK(或者EAGAIN)
7.fcntl : (对设备寄存器进行读写) 可以使用fcntl函数改变一个已打开的文件的属性, 可以重新设置读, 写, 追加, 非阻塞等标志,而不必重新open文件
原型 : int fcntl(int fd, int cmd);
int fcntl(int fd, int cmd, long arg);
int fcntl(int fd, int cmd, struct flock *lock);
作用 : 获取标志, 返回标志,
设置标志
文件加锁
除了F_GETFL和F_SETFL命令外, 还可以设置文件记录锁,。可以通过fcntl设置都是当前进程如何访问设备或文件的访问控制属性
扩展 : 只有 0_APPEND, O_NONBLOCK 可以被改变
8.对于重定向符,,小于默认为 0, 大于 默认为 1, >> ; 无默认参数
9(重要). command > /dev/NULL 2 > &1
2 和 1 同时指向某一个文件, 去除警告。。
10. ioctl : 用于向设备发控制和配置命令,
read/write读写的数据是in-band数据, 是I/O操作的主体,
ioctl命令传送的是控制信息, 其中的数据是辅助的数据 是Out-of-band数据
原型 : int ioctl(int d, int request, ...);
d 是某个设备的文件描述符, request 是ioctl 的命令
11.memory mapping 映射
Memory Managemete Unit 物理地址 -- 格式化-- 虚拟地址 -- --进程空间地址
malloc mmap2
mmap mmap2
12.mmap : 可以把磁盘文件的一部分直接映射到内存,这样文件中的位置直接就有对应的内存地址, 对文件的读写可以直接来做而不需要read/write函数
函数原型 : void *mmap(void *addr, size_t len, int prot, int flag, int filedes, off_t off);
int munmap(void *addr, size_t len);
addr : 表示从什么地方映射,一般为 NULL
len : 映射的长度
prot :
参数有四种取值 :
PROT_EXEC : 表示映射的这一段可执行,例如 :映射共享库
PROT_READ :表示映射的这一段可读
PROT_WRITE : 表示映射的这一段可写
PROT_NONE : 表示映射的这一段不可访问
flag 参数 :
MAP_SHARED :多个进程对同一个文件的映射是共享的,一个进程对映射的内存做了修改,另一个进程也会看到变化
MAP_PRIVATE :多个进程对同一个文件的映射不是共享的,一个进程对映射的内存做了修改,另一个进程并不会看到这中变化,也不会真的写到文件中去
英语: block (块) page(叶) status(状态)