多进程共享epoll fd
来源:互联网 发布:linux scp -P 编辑:程序博客网 时间:2024/05/17 07:42
- #include <stdlib.h>
- #include <strings.h>
- #include <sys/epoll.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include <sys/socket.h>
- #include <arpa/inet.h>
- #include <errno.h>
- void setnonblocking(int fd)
- {
- int val;
- if ((val = fcntl(fd, F_GETFL)) < 0)
- {
- perror("GETFL");
- exit(1);
- }
- val |= O_NONBLOCK;
- if (fcntl(fd, F_SETFL, val) < 0)
- {
- perror("SETFL");
- exit(1);
- }
- }
- int main()
- {
- int fd, listener, clifd, epfd, i, ret, size;
- struct epoll_event ev, events[16];
- char buf[1024];
- int parent = 1;
- int status;
- int pid;
-
- if ((listener = socket(AF_INET, SOCK_STREAM, 0)) < 0)
- {
- perror("socket");
- exit(1);
- }
- setnonblocking(listener);
- epfd = epoll_create(256);
- if (epfd < 0)
- {
- perror("epoll_create");
- exit(1);
- }
- ev.data.fd = listener;
- ev.events = EPOLLIN | EPOLLET;
- if (epoll_ctl(epfd, EPOLL_CTL_ADD, listener, &ev) < 0)
- {
- perror("epoll_ctl");
- exit(1);
- }
-
- struct sockaddr_in servaddr, cliaddr;
- bzero(&servaddr, sizeof(servaddr));
- servaddr.sin_family = AF_INET;
- servaddr.sin_addr.s_addr = INADDR_ANY;
- servaddr.sin_port = htons(5432);
- if (bind(listener, &servaddr, sizeof(servaddr)) < 0)
- {
- perror("bind");
- exit(1);
- }
- if (listen(listener, 16) < 0)
- {
- perror("listen");
- exit(1);
- }
- for (i = 0; i < 3 && parent; i++)
- {
- switch (fork())
- {
- case -1:
- perror("fork");
- exit(1);
- case 0:
- parent = 0;
- pid = getpid();
- break;
- default:
- break;
- }
- }
- if (parent)
- {
- while ((ret = waitpid(-1, &status, 0)))
- {
- if (ret > 0)
- printf("child %d has quit with %d...\n", ret, status);
- }
- }
- socklen_t len;
- while (1)
- {
- if ((ret = epoll_wait(epfd, events, 1, 600000)) < 0)
- {
- perror("epoll_wait");
- exit(1);
- }
- else if (ret == 0)
- {
- printf("[%d]600s elapsed...\n", pid);
- }
- else
- {
- printf("\n[%d]%d events checkin\n", pid, ret);
- }
- for (i = 0; i < ret; i++)
- {
- if ((fd = events[i].data.fd) < 0)
- {
- printf("Invalid fd!\n");
- exit(1);
- }
-
- if (fd == listener)
- {
- len = sizeof(cliaddr);
- clifd = accept(fd, &cliaddr, &len);
- if (clifd < 0)
- {
- perror("accept");
- continue;
- }
- printf("[%d]New connection from %s:%d,fd=%d\n",pid, inet_ntoa(cliaddr.sin_addr),
- ntohs(cliaddr.sin_port), clifd);
- setnonblocking(clifd);
- ev.data.fd = clifd;
- ev.events = EPOLLIN | EPOLLET;
- if (epoll_ctl(epfd, EPOLL_CTL_ADD, clifd, &ev) < 0)
- {
- perror("epoll_ctl");
- exit(1);
- }
- }
- else if (events[i].events & EPOLLIN)
- {
- while ((size = recv(fd, buf, sizeof(buf), 0)) > 0)
- {
- buf[size] = 0;
- printf("[%d]%d bytes recved from fd %d:%s\n", pid, size, fd, buf);
- }
- printf("[%d]size=%d,fd=%d:%s\n", pid, size, fd, strerror(errno));
- if (size == 0)
- {
- close(fd);
- }
- }
- }
- }
- return 0;
- }
epoll_create这段(46-60)放到子进程里面就没问题了。
0 0
- 多进程共享epoll fd
- 多个线程如何操作同一个epoll fd
- 多个线程如何操作同一个epoll fd
- 多个线程如何操作同一个epoll fd
- 多进程epoll模型
- nginx 多进程进程 epoll
- 多线程操作同一个epoll fd同步
- 父子进程间分发FD
- 多进程文件共享
- 多进程共享/同步
- 创建子进程释放父进程FD
- EPOLL+FIFO多进程通信简单示例
- 关于 多进程epoll 与 “惊群”问题
- 关于 多进程epoll 与 “惊群”问题
- 关于 多进程epoll 与 “惊群”问题
- 关于 多进程epoll 与 “惊群”问题
- 一个epoll多进程服务器示例
- epoll多进程回显服务器示例
- 流Optical Flow介绍与OpenCV实现
- Android在SQLite插入大量数据的时的性能优化
- Java获得某目录下文件总大小
- Android有关Service问题汇总
- python 遍历目录下文件
- 多进程共享epoll fd
- HTML网页之俄罗斯方块
- IOS中延时执行的几种方式的比较和汇总
- 第一篇博客
- magento 通过layout文件 实现 block之间通信
- Android Studio导入项目的遇到的两个问题
- c++ int double string互转
- const与#define的区别
- Android开发者的演示工具——asm.jar