C (预)分叉服务器上的epoll读取错误
我开始学习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)
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