笔者将《unix环境高级编程》主要内容总结为三篇:文件篇,进程篇,高级io和进程间通信三大板块。本文是unix环境高级编程系列文章第三篇:高级IO和进程间通信篇。该篇主要包括:
先介绍记录锁的概念和记录锁的数据结构。然后介绍阻塞io,非阻塞IO,异步io,IO多路转接等概念,后者都是针对前者更优的技术。IO多路转接技术包括:select,peslect,poll。最后介绍存储映射IO。
介绍了基本进程间通信机制,包括两大类:
介绍网络间的进程通信机制:套接字。首先是如何寻址。然后介绍socket编程的连接建立,数据传输等。
高级进程间通信提供一种可以在进程间传递文件描述符的机制,包括STREAMS管道和unix域套接字
- 描述符集的设置函数
pselect与select类似,仅仅少部分有差异,如下:
异步io并不像select和poll对所有文件描述符都生效
异步IO是SIGIO(通用异步io)和SIGURG(通知网络进程数据到达)两个信号的组合
- addr:存储映射起始地址,通常设置为0,表示由系统选择地址然后作为返回值返回
- port:说明对存储映射区的保护要求,权限不能超过文件本身权限
- PORT\_READ:映射区可读
- PORT\_WRITE:映射区可写
- PORT\_EXEC:映射区可执行
- PORT\_NONE :映射区不可访问
- flag:
- MAP\_FIXED:返回值必须等于addr,不利于移值
- MAP\_SHARED:存储操作的配置
- MAP\_PRIVATE:创建私有副本更改存储映射区权限:mprotect刷新映射存储区:msync解除存储映射区:munmap
进程间通信机制包括:
消息队列,信号量和共享存储,这三种IPC称做XSI IPC,他们之间有很多共性,包括:
msgctl函数对队列执行多装操作(类似于ioctl,垃圾桶函数)
- domain:套接字域
- type:套接字类型
- protocol:协议,通常为0。表示根据套接字类型默认选择协议关闭套接字:closeshutdown:禁止套接字上的输入/输出,可只关闭一个方向
struct sockaddr{
sa_famliy_t sa_famliy;
char sa_data[];
}
复制代码
//linux实现
struct sockaddr{
sa_famliy_t sa_famliy;
char sa_data[14];
}
//freeBSD实现
struct sockaddr{
unsigned char sa_len;
sa_famliy_t sa_famliy;
char sa_data[14];
}
复制代码