epoll在fork子进程中的问题
epoll_create 创建的 文件描述符和其他文件描述符一样,是被fork出的子进程继承的,那也就是子进程可以使用这个epoll fd添加感兴趣的io(epoll_ctl),然后是可以影响到父进程的epoll_wait。比如,子进程中注册了一个io写事件后,因为某种原因挂起来了,导致父进程的epoll_wait频繁返回,CPU占用率飙升。看下下面的演示代码:
5 int fd = socket(AF_LOCAL, SOCK_STREAM, 0);
6 if (fd < 0) {
7 perror("socket ");
8 exit(-1);
9 }
10 struct sockaddr_un peer_addr;
11 memset(&peer_addr, 0, sizeof(peer_addr));
12 peer_addr.sun_family = AF_LOCAL;
13 const char *ipc_path = "/home/longzhiri/my_code/nettest/localnettest.ipc";
14 strncpy(peer_addr.sun_path, ipc_path, sizeof(peer_addr.sun_path)-1);
15 if (connect(fd, (struct sockaddr *)&peer_addr, SUN_LEN(&peer_addr))<0){
16 perror("connect ");
17 exit(-1);
18 }
19 struct epoll_event ev, events[10];
20 ev.events = EPOLLOUT;
21 ev.data.fd = fd;
22 if (epoll_ctl(epollfd, EPOLL_CTL_ADD, fd, &ev) < 0) {
23 perror("epoll_ctl");
24 exit(-1);
25 }
26
27 sleep(10);
28 epoll_ctl(epollfd, EPOLL_CTL_DEL, fd, &ev);
29 printf("child process exit\n");
30 }
31
32 int main(int argc, char *argv[]) {
33 int epollfd = epoll_create(10);
34 if (epollfd < 0) {
35 perror("epoll_create");
36 return -1;
37 }
38
39 struct epoll_event events[10];
40 int pid = fork();
41 if (pid < 0) {
42 perror("fork");
43 return -1;
44 } else if (pid > 0) {
45 for (;;) {
46 int nfds = epoll_wait(epollfd, events, 10, -1);
47 if (nfds < 0) {
48 perror("epoll_wait 1");
49 return -1;
50 }
51 printf("wake up +++\n");
52 }
53 } else {
54 DoWrite(epollfd);
55 }
56 return 0;
57 }
epoll在fork子进程中的问题的更多相关文章
- epoll在socket通信中的应用
当服务器需要服务多个客户时,需要使用并发通信,实现并发通信有以下几种方法: 1.在服务器中fork子进程来为每个客户服务 具体可参考http://www.cnblogs.com/ggjucheng/ ...
- epoll与fork
使用epoll时,如果在调用epoll_create之后,调用了fork创建子进程,那么父子进程虽然有各自epoll实例的副本,但是在内核中,它们引用的是同一个实例.子进程向自己的epoll实例添加. ...
- fork子进程
title: fork子进程 data: 2019/3/21 20:24:39 toc: true --- 这里实在学习socket编程前的小知识点,用来创建多个服务端 学习文档 函数可以有两个返回值 ...
- [fork]Linux中的fork函数详解
---------------------------------------------------------------------------------------------------- ...
- localtime死锁——多线程下fork子进程
近期測试我们自己改进的redis,发如今做rdb时,子进程会一直hang住.gdb attach上.堆栈例如以下: (gdb) bt #0 0x0000003f6d4f805e in __lll_lo ...
- 缺陷的背后(四)---多进程之for循环下fork子进程引发bug
导语 业务模块为实现高并发时的更快的处理速度,经常会采用多进程的方式去处理业务.多进程模式下常见的三种bug:for循环下fork子进程导致产生无数孙子进程,僵尸进程,接口窜包.本章主要介绍第一种常见 ...
- 转:fork()子进程创建
源地址:http://blog.chinaunix.net/uid-23037385-id-2565472.html fork()子进程创建 在 UNIX 系统中,用户创建一个新进程的唯一方法就是调用 ...
- fork子进程僵尸问题及解决方案
额,原来用 c 写 cgi 的时候用过 fork .那时候 cgi 的生命很短,所以遇到的问题压根没出现过.这次也是更加深入的对 fork 机制进行了一下了解. 参考这里的文档:http://ju.o ...
- fork子进程之间传输信息的方法(包含子进程与子进程之间区分的问题的解决)
今天看到一道题,要求是父进程fork出两个子进程,子进程1需要给子进程2发送一个数据,然后子进程2再将这个数据发送给父进程 具体思想如下. 父进程fork出来的子进程的pid,只有父进程保存下来了, ...
随机推荐
- 腾讯云联合多家生态伙伴,重磅开源 SuperEdge 边缘容器项目
在2020年12月19-20日腾讯 Techo Park 开发者大会上,腾讯云联合英特尔.VMware 威睿.虎牙.寒武纪.美团.首都在线,共同发布 SuperEdge 边缘容器开源项目. Super ...
- SpringBoot项目 @Value("${}") 引入的配置文件的变量不生效 , 需要重启服务才生效解决方案
最近在开发项目的时候遇到的问题,有的变量需要能动态修改,于是决定把该常量放在配置文件中,以后修改配置文件就行了,但是在修改了配置文件的数据之后获取的还是之前的数据,需要重启服务才生效,怎么决解这个问题 ...
- MyBatis-Plus 多表联查+分页
在写东西的过程中,多表联查和分页功能必不可少.当然,crud也很重要 但是又不想写代码和xml. 通过苦苦的查找.发现MyBatis-Plus一款国产的框架.优化了许多操作 本次主要记录一下,多表联查 ...
- 批量修改vsphere共享存储多路径选择策略
传统方式修改存储的多路径选择策略 首先说一下传统web界面操作方式: 可以看到至少需要6次才能修改完成一个.在生产环境中一般会挂载很多FC存储,这时候就需要一个批量快捷的方式来修改. 使用Powerc ...
- 自家公司关于git commit 的规范
代码提交的commit info提个建议,fix的issue是哪个issue?都要有明确的链接.推荐方式:1.建立issue,说明问题的背景和原因.http://git.startdt.net/pay ...
- 在 CAP 中使用 AOP ( Castle.DynamicProxy )
简介 本篇文章主要介绍如何在 CAP 中集成使用 Castle.DynamicProxy,Castle DynamicProxy 是一个用于在运行时动态生成轻量级.NET代理的库.代理对象允许在不修改 ...
- 关于IP的相关计算
不论是考研还是考各种计算机类的证,大家或多或少都会遇到网络部分的一种题型,大体的归类就是以下几种: 已知一个IP是192.XX.XX.XX,子网掩码是255.255.255.0,那么它的网络地址是多少 ...
- spark-streaming-连接kafka的两种方式
推荐系统的在线部分往往使用spark-streaming实现,这是一个很重要的环节. 在线流程的实时数据一般是从kafka获取消息到spark streaming spark连接kafka两种方式在面 ...
- 【项目实践】一文带你搞定Spring Security + JWT
以项目驱动学习,以实践检验真知 前言 关于认证和授权,R之前已经写了两篇文章: [项目实践]在用安全框架前,我想先让你手撸一个登陆认证 [项目实践]一文带你搞定页面权限.按钮权限以及数据权限 在这两篇 ...
- ORA-39700: database must be opened with UPGRADE option【转】
1. 错误 数据库升级后(从11.2.0.1升级到11.2.0.4)启动报错 SQL> startup ORACLE instance started. Total System Globa ...