C (预)分叉服务器上的epoll读取错误

C (预)分叉服务器上的epoll读取错误,c,linux,fork,epoll,C,Linux,Fork,Epoll,我开始学习epoll,并希望创建一个小型服务器来使用它。在网上有很多关于它的讨论,但我不能设法把我的手放在一个可靠的文档上 以下是我到目前为止的程序结构(为了清晰起见,我已经清理了它): 我是不是遗漏了什么 谢谢 PS:我只留下了一些我认为相关的代码。。。以下是其余内容:您可能希望在fork之后而不是之前创建epoll fd。好的,请回答下面的问题,以便我验证您的答案:) int sfd = create_and_bind(PORT_NUMBER); make_non_blocking(sfd)

我开始学习epoll,并希望创建一个小型服务器来使用它。在网上有很多关于它的讨论,但我不能设法把我的手放在一个可靠的文档上

以下是我到目前为止的程序结构(为了清晰起见,我已经清理了它):

我是不是遗漏了什么

谢谢


PS:我只留下了一些我认为相关的代码。。。以下是其余内容:

您可能希望在fork之后而不是之前创建epoll fd。好的,请回答下面的问题,以便我验证您的答案:)
int sfd = create_and_bind(PORT_NUMBER);
make_non_blocking(sfd);
listen(sfd);

int efd = epoll_create1(0);
event.data.fd = sfd;
event.events = EPOLLIN | EPOLLET;
epoll_ctl(efd, EPOLL_CTL_ADD, sfd, &event);

struct epoll_event *events = calloc(MAXEVENTS, sizeof event);

int p, pid = 1;
for (p = 0; p < 2; ++i) {
    if (pid > 0) {
        pid = fork();
    }
}

if(pid == 0) {
    while(1) {
        int n, i;
        n = epoll_wait(efd, events, MAXEVENTS, -1);
        for(i = 0; i < n; ++i) {
            if ((events[i].events & EPOLLERR) || (events[i].events & EPOLLHUP) || (!(events[i].events & EPOLLIN))) {
                // Closing socket
                close(events[i].data.fd);
                continue;
            } else if (sfd == events[i].data.fd) {
                // incoming connection

                int infd = accept(sfd, &in_addr, &in_len);
                // Break while if call blocks
                make_socket_non_blocking(infd);

                event.data.fd = infd;
                event.events = EPOLLIN | EPOLLET;
                epoll_ctl(efd, EPOLL_CTL_ADD, infd, &event);
            } else {
                // Ready to read
                ssize_t count = read(events[i].data.fd, buf, sizeof buf);

                //
                // Here I get some problems
                //
                if (count == -1) {
                    /* If errno == EAGAIN, that means we have read all
                     data. So go back to the main loop. */
                    if (errno != EAGAIN) {
                        perror("read");
                        done = 1;
                    }
                    break;
                } else if (count == 0) {
                    /* End of file. The remote has closed the
                     connection. */
                    done = 1;
                    break;
                }

                if(done) {
                    close(events[i].data.fd);
                }
            }
        }
    }
}
read : Bad file descriptor