Unix进程间通信编程经验总结

 

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(写<FIFO_BUF数据时缓冲区不足,无法保证原自性)

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 日志管理 大型应用软件需要完善的日志功能。首先要分级别,其次要有大小限制,还要可配置打印模块、风格和级别等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值