进程间通信编程经验总结 - baojiangeng的专栏

来源:百度文库 编辑:神马文学网 时间:2024/04/26 15:04:35
进程间通信编程经验总结
1. 非阻塞socket
网络上进程通信方法。
1)使用描述  socket创建时使用fcntl设置O_NONBLOCK标志, 判断连接成功需要在connect后调用一下select看端口是否可以读写。读、写socket前需用select判断,如果读、写不到数据(read、write返回0)则认为出错
2)消息处理  socket读取数据之后,要根据程序的应用层协议拼装为消息对象使用。使用消息缓冲区以及长度字段进行消息解码。(读缓冲区时须注意,读取的部分字节可能不能拼装一个完整的消息,要根据消息长度字段来判断)
3)出错处理 如果读、写socket出错,或者select出错, 在设置为非阻塞的情况下,无需判断是否被中断(?自动重连)。判断出错后,需要根据情况处理,一般清理socket和缓冲区、进行重连。
4)心跳机制 为了判断对端没有断线应用层使用自定义的简单消息进行定时交互。使用select <1不能断定对方断连,需要查看错误码
2. 命名管道FIFO
同一台机器上进程通信方法。与socket特点相同
1)使用描述 创建fifo时指定文件的属性和打开方式(用户可读写),需要处理同名管道存在的情况。
2)数据读写 设置fd为非阻塞,使用多路转接select的方式, 如果有数据读写但是读写不到数据(read、write返回0)认为出错,如果读写结果为-1,需要判断错误码是否为EAGAIN(写3)数据处理和心跳与socket类似
3 系统V共享内存 (使用内存映射)
进程间数据共享的方法
1)使用描述 创建时设置ftok关键字,一般以path和‘A‘为参数,设置访问模式, 如果创建失败,判断是否已经有其他进程创建好。关联进程与shm。
2)  内存映射 所使用的内存来源。 创建一文件使用ftruncate设置大小,然后用fstat判断文件大小是否合适,创建的文件使用mmap创建内存映射
3)空闲内存管理 参考stl的方法,对一大块映射的共享内存进行分块(2^ n n>=0 && n < 12 ), 使用空闲连标和使用链表管理,实际的内存占用在共享内存的其他地方。中心思想就是一次性申请大块内存,不每次malloc
4)同步 进程间使用读写锁机制同步对共享内存的使用
4 信号处理
5 日志管理 大型应用软件需要完善的日志功能。首先要分级别,其次要有大小限制,还要可配置打印模块、风格和级别等。