当前位置: 首页 > news >正文

做爰全过程免费的视网站寿光网站建设m0536

做爰全过程免费的视网站,寿光网站建设m0536,买做指甲的材料在哪个网站,文化宣传 加强网站建设 创办网站07 定时器处理非活动连接#xff08;上#xff09; 基础知识 非活跃#xff0c;是指客户端#xff08;这里是浏览器#xff09;与服务器端建立连接后#xff0c;长时间不交换数据#xff0c;一直占用服务器端的文件描述符#xff0c;导致连接资源的浪费。 定时事件上 基础知识 非活跃是指客户端这里是浏览器与服务器端建立连接后长时间不交换数据一直占用服务器端的文件描述符导致连接资源的浪费。 定时事件是指固定一段时间之后触发某段代码由该段代码处理一个事件如从内核事件表删除事件并关闭文件描述符释放连接资源。 定时器是指利用结构体或其他形式将多种定时事件进行封装起来。具体的这里只涉及一种定时事件即定期检测非活跃连接这里将该定时事件与连接资源封装为一个结构体定时器。 定时器容量是指使用某种容器类数据结构将上述多个定时器组合起来便于对定时事件统一管理。具体的项目中使用升序链表将所有定时器串联组织起来。 整体概述 本项目中服务器主循环为每一个连接创建一个定时器并对每个连接进行定时。另外利用升序时间链表容器将所有容器串联起来若主循环接收到定时通知则在链表中依次执行定时任务。 Linux下提供了三种定时的方法 sokcet选项SO_RECVTIMEO和SO_SNDTIMEOSIGALRM信号I/O复用系统调用的超时参数 三种方法没有一劳永逸的应用场景也没有绝对的优劣。项目中使用的是SIGALRM信号。 利用alarm函数周期性地触发SIGALRM信号信号处理函数利用管道通知主循环主循环接收到该信号后对升序链表上所有定时器进行处理若该段时间内没有交换数据则将该连接关闭释放所占用地资源。 定时器处理非活动连接模块主要分为定时方法与信号通知流程定时器及其容器设计与定时任务地处理。 本文内容 定时方法与信号流程具体设计到基础API、信号通知流程和代码实现。 基础API描述sigaction结构体sigaction函数sigfillset函数SIGALRM信号、SIGTERM信号、alarm函数socketpair函数、send函数。 信号通知流程介绍统一事件源和信号处理机制。 代码实现结合代码对信号处理函数地设计与使用进行详解。 基础API sigaction结构体 struct sigaction{void (*sa_handler)(int);void (*sa_sigaction)(int,siginfo_t *,void *);sigset_t sa_mask;int sa_flags;void (*sa_restorer)(void); }sa_handler是一个函数指针指向信号处理函数sa_sigaction同样是信号处理函数有三个参数可以获得关于信号更详细的信息sa_mask用来指定在信号处理函数执行期间需要被屏蔽的信号sa_flags用于指定信号处理的行为 SA_RESTART使被信号打断的系统调用自动重新发起 SA_NOCLDSTOP使父进程在它的子进程暂停或继续运行时不会收到SIGCHLD信号 SA_NOCLDWAIT使父进程在它的子进程退出时不会收到SIGCHLD信号这时子进程如果退出也不会成为僵尸进程 SA_NODEFER使对信号的屏蔽无效即在信号处理函数执行期间仍能发出这个信号 SA_RESETHAND信号处理之后重新设置为默认的处理方式 SA_SIGINFO使用sa_sigaction成员而不是sa_handler作为信号处理函数sa_restorer一般不使用 sigaction函数 #include signal.hint sigaction(int signum,const struct sigaction *act,struct sigaction *oldact);signum表示操作的信号act表示对信号设置新的处理方式oldact表示信号原来的处理方式返回值0表示成功-1表示有错误发生 sigfillset函数 #include signal.hint sigfillset(sigset_t *set);用来将参数set信号集初始化然后将所有的信号加入到此信号集里。 SIGALRM、SIGTREM信号 #define SIGALRM 14//由alarm系统调用产生timer时钟信号 #define SIGTERM 15//终端发送的终止信号alarm函数 #include unistd.hunsigned int alarm(unsigned int seconds);设置信号传送闹钟即用来设置信号SIGALRM在经过参数seconds秒数后发送给目前的进程。如果未设置信号SIGALRM的处理函数那么alarm默认终止进程。 socketpair函数 在linux下使用socketpair函数能够创建一对套接字进行通信项目中使用管道通信。 #include sys/types.h #include sys/socket.hint socketpair(int domain,int type,int protocol,int sv[2]);domain表示协议族PF_UNIX或者AF_UNIXtype表示协议可以是SOCKSTREAM或者SOCK_DGRAMSOCK_STREAM基于TCPSOCK_DGRAM基于UDPprotocol表示类型只能未0sc[2]表示套接字柄对该两个句柄作用相同均能进行读写双向操作返回结果0创建成功-1创建失败 send函数 #include sys/types.h #include sys/socket.hssize_t send(int sockfd,const void *buf,size_t len,int flags);当套接字发送缓冲区变满后send通常会阻塞除非套接字设置为非阻塞模式当缓冲区变满时返回EAGAIN或者EWOULDBLOCK错误此时可以调用select函数来监视何时可以发送数据。 信号通知流程 Linux下的信号采用的异步处理机制信号处理函数和当前进程是两条不同的执行路线。具体的当进程收到信号时操作系统会中断当前的正常流程转而进入信号处理函数执行操作完成后再返回中断的地方继续执行。 为避免信号竞态现象发生信号处理期间系统不会再次触发它。所以为确保该信号不被屏蔽太久信号处理函数需要尽可能快地执行完毕。 一般的信号处理函数需要处理该信号对应的逻辑当逻辑比较复杂时信号处理函数执行时间过长会导致信号屏蔽太久。 这里的解决方案是信号处理函数仅仅发送信号通知程序主循环将信号对应的处理逻辑放在程序主循环中由主循环执行信号对应的逻辑代码。 统一事件源 统一事件源是指将信号事件与其他事件一样处理。 信号处理函数使用管道将信号传递给主循环信号处理函数往管道的写端写入信号值主循环则从管道的读端读出信号值使用I/O复用系统调用来监听管道读端的可读事件这样信号事件与其他文件描述符都可以通过epoll来检测从而实现统一处理。 信号处理机制 每个进程之中都有存着一个表里面存着每种信号所代表的含义内核通过设置表项中每一个位来标识对应的信号类型。 信号的接收 接收信号的任务是由内核代理的当内核接收到信号后会将其放到对应进程的信号队列中同时向进程发送一个中断使其陷入内核态。此时信号还只是在队列中对进程来说暂时是不知道由信号到来的。 信号的检测 进程从内核态返回到用户态前进行信号检测进程在内核态中从睡眠状态被唤醒的时候进行信号检测进程陷入内核态后由两种场景会对信号进行检测当发现有新信号时便会进入下一步信号的处理 信号的处理 内核信号处理函数是运行在用户态的调用处理函数前内核会将当前内核栈的内容备份拷贝到用户栈上并且修改指令寄存器eip将其指向信号处理函数。用户接下来进程返回到用户态中执行相应的信号处理函数内核信号处理函数执行完成后还需要返回内核态检查是否还有其他信号未处理用户如果所有信号都处理完成就会将内核栈恢复从用户栈的备份拷贝回来同时恢复指令寄存器eip将其指向中断前的运行位置最后回到用户态继续执行进程。 至此一个完整的信号处理流程便结束了如果同时有多个信号到达上面的处理流程会在第2步和第3步骤间重复进行。 代码分析 信号处理函数 自定义信号处理函数创建sigaction结构体变量设置信号函数。 //信号处理函数 void sig_handler(int sig) {//为保证函数的可重入性保证原来的errno//可重入性表示中断后再次进入该函数环境变量与之前相同不会丢失数据int save_errnoerrno;int msgsig;//将信号值从管道写端写入传输字符类型而非整型send(pipefd[1],(char *)msg,1,0);//将原来的errno赋值为当前的errnoerrnosave_errno; }信号处理函数中仅仅通过管道发送信号值不处理信号对应的逻辑缩短异步执行时间减少对主程序的影响。 //设置信号函数 void addsig(int sig,void(handler)(int),bool restarttrue) {//创建sigaction结构体变量struct sigaction sa;memset(sa,\0,sizeof(sa));//信号处理函数中仅仅发送信号值不做对应逻辑处理sa.handlerhandler;if(restart)sa.sa_flags|SA_RESTART;//将所有信号添加到信号集中sigfillset(sa.sa_mask);//执行sigaction函数assert(sigaction(sig,sa,NULL)!-1); }项目中设置信号函数仅关注SIGALRM和SIGTERM两个信号。 信号通知逻辑 创建管道其中管道写端写入信号值管道读端通知I/O复用系统监测读事件设置信号处理函数SIGALRM时间到了触发和SIGTERMkill会触发CtrlC 通过struct sigaction结构体和sigaction函数注册信号捕捉函数 在结构体的handler参数设置信号处理函数具体的从管道写端写入信号的名字利用I/O复用系统监听管道读端文件描述符的可读事件信号值传递给主循环主循环再根据收到的信号值执行目标信号对应的逻辑代码 代码分析 //创建管道套接字 retsocketpair(PF_UNIX,SOCK_STREAM,0,pipefd); assert(ret!-1);//设置管道写端为非阻塞为什么写端要非阻塞 setnonblocking(pipefd[1]);//设置管道读端为ET非阻塞 addfd(epollfd,pipefd[0],false);//传递给主循环的信号值这里只关注SIGALRM和SIGTERM addsig(SIGALRM,sig_handler,false); addsig(SIGTERM,sig_handler,false);//循环条件 bool stop_serverfalse;//c超时标志 bool timeoutfalse;//每隔TIMESLOT时间触发SIGALRM信号 alarm(TIMESLOT);while(!stop_server) {//监测发生事件的文件描述符int numberepoll_wait(epollfd,events,MAX_EVENT_NUMBER,-1);if(number0errno!EINTR){break;}//轮询文件描述符for(int i0;inumber;i){int sockfdevents[i].data.fd;//管道读端对应文件描述符发生读事件if((sockfdpipefd[0])(events[i].eventsEPOLLIN)){int sig;char signals[1024];//从管道读端读出信号值成功返回字节数失败返回-1//正常情况下这里的ret返回值总是1只有14和15两个ASCII码对应的字符retrecv(pipefd[0],signals,sizeof(signals),0);if(ret-1){//handler the errorcontinue;}else if(ret0){continue;}else{//处理信号值对应的逻辑for(int i0;iret;i){//这里面是字符switch(signals[i]){//这里是整型case SIGALRM:{timeouttrue;break;}case SIGTERM:{stop_servertrue;}}}}}} } 为什么管道写端要非阻塞 send是将信息发送给套接字缓冲区如果缓冲区满了则会阻塞这时候会进一步增加信号处理函数的执行事件为此将其修改为非阻塞。 没有对非阻塞返回值处理如果阻塞是不是意味着这一次定时事件失效了 是的但定时事件是非必须立即处理的事件可以允许这样的情况发生。 管道传递的是什么类型switch-case的变量冲突 信号本身是整型数值管道中传递的是ASCII码表中整型数值对应的字符。 switch的变量一般为字符或整型当switch的变量为字符时case可以是字符也可以是字符对应的ASCII码。
http://www.hkea.cn/news/14283759/

相关文章:

  • 建站的cms网站常用的优化方法有哪些
  • 网站建设费用 计入什么科目搜索网站做淘宝客
  • 网站建设调研论文网页设计师的工作时间
  • 网站系统 深圳博域通讯南昌 定制网站
  • 东莞中英文网站建设如何建设专题网站
  • 专业网站建设公司排名互联网推广公司
  • 一般网站开发语言tom企业邮箱
  • 北京征集网站建设培训机构网站如何建设
  • 湘潭网站建设湘潭vps 网站打不开
  • 如何高效的完成网站建设步骤WordPress添加海报分享
  • wordpress账号登录seo优化知识总结
  • 嘉兴网站排名优化在后台怎么做网站内链
  • 互联网门户网站建设网站建设计入什么费用
  • 手机网站底部漂浮代码公司网站开发
  • 网站如何防注册机安徽省卫生计生网站医共体建设
  • 模板王网站温州网站开发平台
  • 哪家微网站做的好西宁企业做网站
  • 城市建设招标网站连云港建设工程安全网站
  • 长春 网站建设网络推广网页设计成都百度网站制作
  • 楚雄建网站朔州做网站公司
  • 钟山县住房和城乡建设局网站众筹网站建设应该具备哪些资质
  • 建立自己的网站怎么样做建好网站后最怎么维护
  • 如何知道网站是用什么语言做的基于phpt漫画网站开发
  • 克拉玛依做网站个人网站免费搭建
  • 怎么在新建网站上做分享代码用flash做网站超链接
  • 网站建设与管理专业学什么虚拟产品货源渠道
  • 好网站建设公司哪家好php mysql做网站
  • 重庆铜梁网站建设德语网站建设
  • 网站建站时间wordpress 插件 调用
  • 湖北优化网站建设手表商城网站建设方案