对 evt driver 和子进程一起做单元测试,为了方便,直接在父进程中先初始化了 evt driver,
其中用的内核事件驱动为 epoll;设想中的子进程在分离后,会产生一份新的epoll驱动;然而却出现了完全
意想不到的事情,看日志:
- [4206#2053186656]: epoll add event: fd:6 ev:1
- [4205#2053186656]: epoll add event: fd:5 ev:1
- [4206#2053186656]: epoll: 0: fd:6 rev:0001
- [4206#2053186656]: epoll: 0: fd:5 rev:0001
日志中的第一个数字为进程号,明显:4205为父进程,4206为子进程;父进程在epoll中监控了fd=5
子进程监控了fd=6;第三行日志为子进程关注的fd=6有数据,正常现象;第四行,竟然出现了一个没注册过
的fd=5事件出来了;epoll事件中的data指向了一个未初始化的地方(实际上是父进程的一个初始化过的
结构);于是崩溃了;
了解了,epoll 是能被子进程继承的,且父子会公用一份内核变量,共享了epoll的所有数据;自然
悲剧了...
于是,如果需要父子进程都需要epoll,一定要分别初始化....
阅读(997) | 评论(0) | 转发(0) |