UNIX环境高级编程笔记——高级IO,进程间通信,套接字,高级进程间通信

时间:2021-08-29 03:56:29


14 高级IO

  1. 非阻塞IO:这里我要抽时间看看AIO的使用。
  2. 记录锁:运行一个进程修改一个文件的一部分的时候,禁止其进程修改统一区域。
  3. 流在用户经常和设备驱动程序间提供了一个全双工通道。
  4. readv和writev:散布读和聚集写。散布读:将文件中的数据一次读到多个缓冲区中;聚集写:将多个缓冲区的数据一次写到文件中。好处是完成统一的操作,可以使用更少的系统调用。
  5. readn和writen向管道,fifo,终端,网络等读或者写直到操作n个字节。
  6. mmap:这个函数还是非常有用的:void *mmap(void *addr, size_t len, int prot, int flag, int fileds, off_t off)
    1. addr一般设置为0.有更好的移植性。
    2. off和addr通常是虚存页长整数倍。
    3. 映射区部分在栈与堆之间。
    4. fork后,子进程继承映射区。执行exec后不继承映射区。
    5. msync可以将映射区中的更改同步到文件中。
    6. munmap解除映射。但不会使映射区的内容写到文件中。
    7. 通过映射写入文件中时,需要设置(lseek,然后write一个字节)文件的长度,保证它足够大。否则会引起总线错误。
    8. 存储区映射可以用来提高IO速度:比如文件复制,可以减少内核缓冲区到应用程序缓冲区的复制。
    9. 也可以用作进程间通信:共享存储区。
    10. 映射后,修改文件不会同步到内存中。

15 进程间通信

  1. 管道:最古老的IPC。半双工。类似于与shell中的管道线,将一个命令的输出连接另外一个输入。通过函数pipe实现。父进程关闭读端口,子进程关闭写端。
  2. popen:执行一个shell命令,然后返回连接这个子进程输入或者输出的文件句柄。
  3. FIFO:相对于管道,不相关的进程也可以利用fifo进行通信。单向通道。
  4. 消息队列:新的应用中不应使用。
  5. xsi信号量太复杂。
  6. XSI共享存储:最快的一种方式。需要考虑多个进程间的同步机制。

16 网络IPC:套接字

  1. SCTP可以后面尝试一下:长度固定,有序,可靠面向连接,报文传输,不用分包,后面可以考虑多使用这个通信协议。

     看不下去,后面再看。

17 高级进程间通信

  1. STREAMS管道:提供双向管道。创建函数:s_pipe,将两个文件描述符读端和写端相连,每个进程关闭一个,只用其中一个。
  2. 命名的STREAMS管道:提供了一种供不相关进程使用STREAMS管道的的机制。使用函数fattach将一个文件描述符与一个文件关联。之后此文件对应的底层文件就是不可访问的,所有之后打开的文件都是访问的此管道。之前打开的文件描述符可以访问底层文件。fdetach可以撤销STREAMS管道文件与文件系统名字的关联。撤销后之前能够访问此管道的进程依然能够访问。
  3. 为了保证管道的唯一连接,提供了一种机制:服务端监听管道,接收连接,并返回新的描述符。客户端连接服务端。函数:serv_listen,serv_accept,serv_conn.
  4. Unix域套接字:比普通套接字效率更高。仅在进程间复制数据,没有协议头,计算顺序号等TCPIP操作。
  5. 传送文件描述符:在不同进程将传递文件描述符,一个用法是服务端打开文件描述符,然后调用STREAMS管道将这个文件描述符发送给接收进程,而对接受进程屏蔽打开细节。发送进程一般在发送后关闭文件描述符,但系统不会关闭该文件,因为接收进程已经打开文件。