14 高级IO
- 非阻塞IO:这里我要抽时间看看AIO的使用。
- 记录锁:运行一个进程修改一个文件的一部分的时候,禁止其进程修改统一区域。
- 流在用户经常和设备驱动程序间提供了一个全双工通道。
- readv和writev:散布读和聚集写。散布读:将文件中的数据一次读到多个缓冲区中;聚集写:将多个缓冲区的数据一次写到文件中。好处是完成统一的操作,可以使用更少的系统调用。
- readn和writen向管道,fifo,终端,网络等读或者写直到操作n个字节。
-
mmap:这个函数还是非常有用的:void *mmap(void *addr, size_t len, int prot, int flag, int fileds, off_t off)
- addr一般设置为0.有更好的移植性。
- off和addr通常是虚存页长整数倍。
- 映射区部分在栈与堆之间。
- fork后,子进程继承映射区。执行exec后不继承映射区。
- msync可以将映射区中的更改同步到文件中。
- munmap解除映射。但不会使映射区的内容写到文件中。
- 通过映射写入文件中时,需要设置(lseek,然后write一个字节)文件的长度,保证它足够大。否则会引起总线错误。
- 存储区映射可以用来提高IO速度:比如文件复制,可以减少内核缓冲区到应用程序缓冲区的复制。
- 也可以用作进程间通信:共享存储区。
- 映射后,修改文件不会同步到内存中。
15 进程间通信
- 管道:最古老的IPC。半双工。类似于与shell中的管道线,将一个命令的输出连接另外一个输入。通过函数pipe实现。父进程关闭读端口,子进程关闭写端。
- popen:执行一个shell命令,然后返回连接这个子进程输入或者输出的文件句柄。
- FIFO:相对于管道,不相关的进程也可以利用fifo进行通信。单向通道。
- 消息队列:新的应用中不应使用。
- xsi信号量太复杂。
- XSI共享存储:最快的一种方式。需要考虑多个进程间的同步机制。
16 网络IPC:套接字
- SCTP可以后面尝试一下:长度固定,有序,可靠面向连接,报文传输,不用分包,后面可以考虑多使用这个通信协议。
看不下去,后面再看。
17 高级进程间通信
- STREAMS管道:提供双向管道。创建函数:s_pipe,将两个文件描述符读端和写端相连,每个进程关闭一个,只用其中一个。
- 命名的STREAMS管道:提供了一种供不相关进程使用STREAMS管道的的机制。使用函数fattach将一个文件描述符与一个文件关联。之后此文件对应的底层文件就是不可访问的,所有之后打开的文件都是访问的此管道。之前打开的文件描述符可以访问底层文件。fdetach可以撤销STREAMS管道文件与文件系统名字的关联。撤销后之前能够访问此管道的进程依然能够访问。
- 为了保证管道的唯一连接,提供了一种机制:服务端监听管道,接收连接,并返回新的描述符。客户端连接服务端。函数:serv_listen,serv_accept,serv_conn.
- Unix域套接字:比普通套接字效率更高。仅在进程间复制数据,没有协议头,计算顺序号等TCPIP操作。
- 传送文件描述符:在不同进程将传递文件描述符,一个用法是服务端打开文件描述符,然后调用STREAMS管道将这个文件描述符发送给接收进程,而对接受进程屏蔽打开细节。发送进程一般在发送后关闭文件描述符,但系统不会关闭该文件,因为接收进程已经打开文件。