EPOLL+FIFO多进程通信简单示例

在linux多进程服务程序中,可以使用FIFO的方式实现进程间的通信。当子进程很多,或通信量很大的情况下,父进程通过epoll来进行IO复用是提高系统性能的很好选择。

epoll的优势:

epoll是2.6版本内核引入的新特性,相对于以前的IO复用方式poll和select方式,epoll能显著减少程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。

使用epoll的主要步骤:

包含头文件 #include <sys/epoll.h>

主要函数为:

int epoll_create(int size)

创建epoll的文件描述符   参数size告诉内核预计要监听的fd数目,但不是最大数目,成功返回epoll的fd,出错返回-1。在使用完epoll后一定要close(),否则会浪费系统的fd

 

int epoll_ctl(int epfd, int op, int fd, stuct epoll_event *event) 

epoll事件注册函数                   epfd为epoll实例的fd, op为操作类型:EPOLL_CTL_ADD:注册新的fd到epfd中; EPOLL_CTL_MOD:修改已经注册的fd的监听事件; EPOLL_CTL_DEL:从epfd中删除一个fd

 

         epoll_event的结构体为:

         struct epoll_event {

               __u32  events;

               union{

                     void *ptr;

                     int    fd;

                     __u32 u32;

                     __u64 u64;

               }data;

         }

 

events可以是以下几个宏的集合:
EPOLLIN :表示对应的文件描述符可以读(包括对端SOCKET正常关闭);
EPOLLOUT:表示对应的文件描述符可以写;
EPOLLPRI:表示对应的文件描述符有紧急的数据可读(这里应该表示有带外数据到来);
EPOLLERR:表示对应的文件描述符发生错误;
EPOLLHUP:表示对应的文件描述符被挂断;
EPOLLET: 将EPOLL设为边缘触发(Edge Triggered)模式,这是相对于水平触发(Level Triggered)来说的。缺省状态为LT
EPOLLONESHOT:只监听一次事件,当监听完这次事件之后,如果还需要继续监听这个socket的话,需要再次把这个socket加入到EPOLL队列里

 

int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout)

等待事件的产生   参数events用来从内核得到事件的集合,maxevents告之内核这个events有多大,这个 maxevents的值不能大于创建epoll_create()时的size,参数timeout是超时时间(毫秒,0会立即返回,-1将不确定,也有说法说是永久阻塞)。该函数返回需要处理的事件数目,如返回0表示已超时

 

LT与ET的区别:

LT为level triggered 水平触发模式 ,是EPOLL的缺省工作模式,只是阻塞和非阻塞的socket。

ET为edge triggered 上升沿触发模式,只支持非阻塞的socket。

工作方式的主要区别是,当文件描述符就绪是,内核会发出通知,在LT的模式下,如果没有对该文件描述符进行处理,内核会持续提醒,直到完成。而在ET模式下,内核只会提醒一次,然后就假设用户已经对该描述符进行了处理,不再继续提示了。

 

另外要注意的一个细节是,当子进程退出时,程序会收到SIGCHILD的信号,会导致程序在epoll_wait处返回-1,并使epoll_wait报错,且错误码为EINTR,这时实际上程序并没有出错,还能够正常运行,所以在这正情况下应该让其继续运行(continue)而不退出

 

代码如下,其中主进程拥有一个FIFO,保存在/tmp/下,以进程ID.fifo为文件名。当子进程启动后,要首先打开父进程的FIFO,向其中写入请求连入信息。子进程也创建自己的FIFO,也是保存在/tmp/下,以pid.fifo为文件名,并用这个FIFO向主进程发送信息,其构成为4个byte的包头和包体,包头描述包的长度,包体为要发送的内容

 

 

参考:http://apps.hi.baidu.com/share/detail/7319502

参考: http://blog.chinaunix.net/u/16292/showart_1844376.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值