I/O 分为阻塞和非阻塞,阻塞就是我要一个东西,然后得不到就在那等,非阻塞就是,我要一个东西,对方立马返回结果说没有,那我就继续做其他的事,要设置非阻塞,方法有:
1.open需要指定O_NONBLOCK
2. set_fl指定文件状态标志为O_NONBLOCK
标准输出是普通文件或者终端STDOUT,STDERR,那么结果可能是不同的
14.3 记录锁
更准去的来说,是字节范围锁,也即给部分文件加锁
看到父进程和子进程之间的关系图,太无聊了
加锁,没啥要读的 看到402 强制性锁和建议性锁
14.4 I/O多路转接
阻塞IO 就是我要一个东西,得不到就死等, 非阻塞就是 我要一个东西,得不到就立即返回,过一回再来要(轮询)
非阻塞IO可以提升效率,但是这种技术依赖于信号量,因此只适合终端设备和网络IO
14.4.1 select和pselect
Maxfdp1 为描述符最大值 + 1, readfds,writefds等为select关心的读,写的描述符集合,如果readfds有readfds[i]是准备好,则该readfds[i]置为1
pselect和select其实是类似的
14.4.2 poll函数
nfds为数组fdarray的长度,pollfd结构体如下:
events为我们对文件描述符fd感兴趣的事件, revents为在fd上发生过的时间:
总而言之,poll就是把一堆感兴趣的fd传进去,并表明对这些fd的哪些事件感兴趣
14.5 异步I/O
14.5.1 ~14.5.2 system V和bsd异步I/O
其实都是用信号量来完成的
14.5.3 POSIX异步I/O
其实就是AIO
结构有个sigevent,用来表示IO完成以后,我们应该采取的的动作
其中字段sigev_notify表示通知的类型:
SIGREV_NONE 不通知进程
SIGREV_SIGNAL 发给捕捉该信号的进程,入队
SIGREV_THREAD 执行sigev_notify_function指定的函数
看到424页