网络编程、SIGIO、poll/select/epoll理解

创作人QQ:851301776,邮箱:lfr890207@163.com, 欢迎大家一起技术交流,本博客主要是自己学习的心得体会,只为每天进步一点点!

个人座右铭:1.没有横空出世,只要厚积一定发。

                      2.你可以学历不高,你可以不上学,但你不能不学习。

一. socket初识

   1.概念:socket又名“插座”,由以下两部分组成:

(1)文件fd:linux下一切皆文件,此fd可用于对此文件进行ioctl(操作函数)控制。(IO部分)
(2)网络部分(五元组):sIP(源IP)、sport(源端口)、dIP(目的IP)、dport(目的端口)、协议(传输层协议tcp或者udp)。

  2.tcp和udp说明

(1)tcp基于连接,为可靠传输。

(2)udp基于无连接,为不可靠传输。

3.tcp三次握手发生时间阶段

(1)client :三次握手发生在connect函数中。

(2)server:listen阻塞等三次握手第一次的请求到来,在建立完成三次握手后,把对应client信息加入accept队列,三次握手完成。  系统会通过检测accept队列,来调用accept函数,建立连接。

二、SIGIO信号

1.基础概念:(1)此信号表示文件描述符准备就绪

                       (2)Linux系统中有31种信号,从1到31号信号,信号的序号为信号所对应的的数值。

2.网络编程适用范围:适合UDP,不适合tcp:

原因:1.udp基于无连接,在有数据到来时,网络协议栈告诉应用程序,由应用程序对应信号的处理函数进行处理。

           2:tcp理论可行,但是实际不行,主要原因如下:

            (1)应用层信号处理函数需要处理两部分,accept和recv部分,比较难处理。

            (2)tcp处理的时候,sigio信号太多。

3.进程的信号集如何保存信号?

 进程保存信号,可以查看内核源码Sched.h中的task_struct结构体中的sighand_struct结构体保存。

4.调用signal,如何保存信号?
在每个进程空间,都有一个sighand_struct->sigaction->action[64]的集合,专门用来存储对应的信号。调用signal信号后,把信号存储到action[sig-1]的位置。

注意:sig表示信号的序号也是信号对应的值, sig-1是因为数组的原因,比如28号信号存储到action[27].

5.信号如何发送的?

在内核源码signal.c中signalfd_notify函数进行通知,如果waitqueuqe_active函数条件满足,通知应用层。

6.进程中信号处理流程原理,由两部分组成:

(1)注册部分:应用层在调用signal函数时,进程把对应的信号存储到action[sig-1]的位置,不同的信号存到不同的位置。并且把信号处理函数注册为回调函数,然后等待waitqueue_action函数的条件满足。
(2)回调处理:当waitqueue_action条件满足后,调用信号处理函数进行处理。

   

三、多路复用poll/select/epoll初识
多路复用概念:管理多路IO的一种方法


1.poll
(1)函数模型pool(pfd,length,timeout);

  (2)   原理:在等待timeout时间后,把对应fd,传给内核,如果对应的fd可操作,内核返回对应fd,具体读、写、错误,可以通过对应方式获得。
2.select

(1)函数原型:select(maxfd+1, rfds, wfds,efds, timeout);
           rfds:读集合
           wfds;写集合

           efds:错误集合

           timeout:等待时间

           maxfd+1:要操作的所有fd数量,

(2)原理:select函数把所有fd传入内核,然后在select函数内部阻塞等待。

         a.如果有fd可操作,内核返把要操作的fd放到对应的集合中,select立即返回。

         b.如果没有fd课操作,select阻塞timeout时间,返回。

         c.select返回后,对对应的fd操作或者不操作,清理对应的集合,再次阻塞。

3.epoll 
 (1)epoll_create();此函数的参数,只有大于0和等于0的区别,在我们使用的时候,必须传入大于0的数值作为参数。

(2)原理:epoll把所有监控的fd传入内核,当有fd有数据要读取时,返回给对应的fd到epoll_wait,应用层进行处理。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

QQ851301776

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值