epoll与fork

在调用epoll_create后立即进行fork操作,会导致父进程和子进程共享同一内核中的epoll实例。这使得子进程对epoll的操作会影响到父进程的epoll_wait。例如,子进程添加的监听套接字会在父进程的epoll_wait中触发事件,导致父进程尝试accept失败。为了避免这种问题,建议在fork后各自创建独立的epoll实例,或者在fork前避免创建epoll实例。
摘要由CSDN通过智能技术生成

         使用epoll时,如果在调用epoll_create之后,调用了fork创建子进程,那么父子进程虽然有各自epoll实例的副本,但是在内核中,它们引用的是同一个实例。子进程向自己的epoll实例添加、修改和删除文件描述符时,是可以影响到父进程的epoll_wait的。所以会发生意想不到的问题,分情况看一下:

 

         1:向子进程中的epoll实例添加描述符,描述符事件触发后,也会影响到父进程的epoll实例,代码如下:

#define MAXEVENTS 20

int listenfd;   
struct epoll_event events[MAXEVENTS];

int epfd = epoll_create(MAXEVENTS);

if((pid = fork()) < 0)  return;

if(pid == 0)
{
    listenfd = socketfd();
    struct epoll_event lisevent;
    lisevent.events = EPOLLIN;
    lisevent.data.fd = listenfd;
    
    res = epoll_ctl(epfd, EPOLL_CTL_ADD, listenfd, &lisevent);
}

while(1)
{
    res = epoll_wait(epf
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值