




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基本知识poll的机制与select类似,与select在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是poll没有最大文件描述符数量的限制。poll和select同样存在一个缺点就是,包含大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,而不论这些文件描述符是否就绪,它的开销随着文件描述符数量的增加而线性增大。2、poll函数函数格式如下所示:# include int poll ( struct pollfd * fds, unsigned int nfds, int timeout);pollfd结构体定义如下:structpollfdintfd;/*文件描述符*/shortevents;/*等待的事件*/shortrevents;/*实际发生了的事件*/;每一个pollfd结构体指定了一个被监视的文件描述符,可以传递多个结构体,指示poll()监视多个文件描述符。每个结构体的events域是监视该文件描述符的事件掩码,由用户来设置这个域。revents域是文件描述符的操作结果事件掩码,内核在调用返回时设置这个域。events域中请求的任何事件都可能在revents域中返回。合法的事件如下:POLLIN有数据可读。POLLRDNORM 有普通数据可读。POLLRDBAND有优先数据可读。POLLPRI有紧迫数据可读。POLLOUT 写数据不会导致阻塞。POLLWRNORM 写普通数据不会导致阻塞。POLLWRBAND 写优先数据不会导致阻塞。POLLMSGSIGPOLL消息可用。此外,revents域中还可能返回下列事件:POLLER 指定的文件描述符发生错误。POLLHUP指定的文件描述符挂起事件。POLLNVAL指定的文件描述符非法。这些事件在events域中无意义,因为它们在合适的时候总是会从revents中返回。使用poll()和select()不一样,你不需要显式地请求异常情况报告。POLLIN|POLLPRI等价于select()的读事件,POLLOUT|POLLWRBAND等价于select()的写事件。POLLIN等价于POLLRDNORM|POLLRDBAND,而POLLOUT则等价于POLLWRNORM。例如,要同时监视一个文件描述符是否可读和可写,我们可以设置events为POLLIN|POLLOUT。 在poll返回时,我们可以检查revents中的标志,对应于文件描述符请求的events结构体。如果POLLIN事件被设置,则文件描述符可以被读取而不阻塞。如果POLLOUT被设置,则文件描述符可以写入而不导致阻塞。这些标志并不是互斥的:它们可能被同时设置,表示这个文件描述符的读取和写入操作都会正常返回而不阻塞。timeout参数指定等待的毫秒数,无论I/O是否准备好,poll都会返回。timeout指定为负数值表示无限超时,使poll()一直挂起直到一个指定事件发生;timeout为0指示poll调用立即返回并列出准备好I/O的文件描述符,但并不等待其它的事件。这种情况下,poll()就像它的名字那样,一旦选举出来,立即返回。返回值和错误代码成功时,poll()返回结构体中revents域不为0的文件描述符个数;如果在超时前没有任何事件发生,poll()返回0;失败时,poll()返回-1,并设置errno为下列值之一:EBADF 一个或多个结构体中指定的文件描述符无效。EFAULTfds指针指向的地址超出进程的地址空间。EINTR 请求的事件之前产生一个信号,调用可以重新发起。EINVALnfds参数超出PLIMIT_NOFILE值。ENOMEM 可用内存不足,无法完成请求。3、测出程序编写一个echo server程序,功能是客户端向服务器发送信息,服务器接收输出并原样发送回给客户端,客户端接收到输出到终端。服务器端程序如下: 1 #include 2 #include 3 #include 4 #include 5 6 #include 7 #include 8 #include 9 #include 10 #include 11 12 #define IPADDRESS 13 #define PORT 8787 14 #define MAXLINE 1024 15 #define LISTENQ 5 16 #define OPEN_MAX 1000 17 #define INFTIM -1 18 19 /函数声明 20 /创建套接字并进行绑定 21 static int socket_bind(const char* ip,int port); 22 /IO多路复用poll 23 static void do_poll(int listenfd); 24 /处理多个连接 25 static void handle_connection(struct pollfd *connfds,int num); 26 27 int main(int argc,char *argv) 28 29 int listenfd,connfd,sockfd; 30 struct sockaddr_in cliaddr; 31 socklen_t cliaddrlen; 32 listenfd = socket_bind(IPADDRESS,PORT); 33 listen(listenfd,LISTENQ); 34 do_poll(listenfd); 35 return 0; 36 37 38 static int socket_bind(const char* ip,int port) 39 40 int listenfd; 41 struct sockaddr_in servaddr; 42 listenfd = socket(AF_INET,SOCK_STREAM,0); 43 if (listenfd = -1) 44 45 perror(socket error:); 46 exit(1); 47 48 bzero(&servaddr,sizeof(servaddr); 49 servaddr.sin_family = AF_INET; 50 inet_pton(AF_INET,ip,&servaddr.sin_addr); 51 servaddr.sin_port = htons(port); 52 if (bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr) = -1) 53 54 perror(bind error: ); 55 exit(1); 56 57 return listenfd; 58 59 60 static void do_poll(int listenfd) 61 62 int connfd,sockfd; 63 struct sockaddr_in cliaddr; 64 socklen_t cliaddrlen; 65 struct pollfd clientfdsOPEN_MAX; 66 int maxi; 67 int i; 68 int nready; 69 /添加监听描述符 70 clientfds0.fd = listenfd; 71 clientfds0.events = POLLIN; 72 /初始化客户连接描述符 73 for (i = 1;i OPEN_MAX;i+) 74 clientfdsi.fd = -1; 75 maxi = 0; 76 /循环处理 77 for ( ; ; ) 78 79 /获取可用描述符的个数 80 nready = poll(clientfds,maxi+1,INFTIM); 81 if (nready = -1) 82 83 perror(poll error:); 84 exit(1); 85 86 /测试监听描述符是否准备好 87 if (clientfds0.revents & POLLIN) 88 89 cliaddrlen = sizeof(cliaddr); 90 /接受新的连接 91 if (connfd = accept(listenfd,(struct sockaddr*)&cliaddr,&cliaddrlen) = -1) 92 93 if (errno = EINTR) 94 continue; 95 else 96 97 perror(accept error:); 98 exit(1); 99 100 101 fprintf(stdout,accept a new client: %s:%dn, inet_ntoa(cliaddr.sin_addr),cliaddr.sin_port);102 /将新的连接描述符添加到数组中103 for (i = 1;i OPEN_MAX;i+)104 105 if (clientfdsi.fd maxi ? i : maxi);120 if (-nready = 0)121 continue;122 123 /处理客户连接124 handle_connection(clientfds,maxi);125 126 127 128 static void handle_connection(struct pollfd *connfds,int num)129 130 int i,n;131 char bufMAXLINE;132 memset(buf,0,MAXLINE);133 for (i = 1;i = num;i+)134 135 if (connfdsi.fd 0)136 continue;137 /测试客户描述符是否准备好138 if (connfdsi.revents & POLLIN)139 140 /接收客户端发送的信息141 n = read(connfdsi.fd,buf,MAXLINE);142 if (n = 0)143 144 close(connfdsi.fd);145 connfdsi.fd = -1;146 continue;147 148 / printf(read msg is: );149 write(STDOUT_FILENO,buf,n);150 /向客户端发送buf151 write(connfdsi.fd,buf,n);152 153 154 客户端代码如下所示: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 11 #define MAXLINE 102412 #define IPADDRESS 13 #define SERV_PORT 878714 15 #define max(a,b) (a b) ? a : b16 17 static void handle_connection(int sockfd);18 19 int main(int argc,char *argv)20 21 int sockfd;22 struct sockaddr_in servaddr;23 sockfd = socket(AF_INET,SOCK_STREAM,0);24 bzero(&servaddr,sizeof(servaddr);25 servaddr.sin_family = AF_INET;26 servaddr.sin_port = htons(SERV_PORT);27 inet_pton(AF_INET,IPADDRESS,&servaddr.sin_addr);28 connect(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr);29 /处理连接描述符30 handle_connection(sockfd);31 return 0;32 33 34 static void handle_connection(int sockfd)35 36 char sendlineMAXLINE,recvlineMAXLINE;37 int maxfdp,stdineof;38 struct pollfd pfds2;39 int n;40 /添加连接描述符41 pfds0.fd = sockfd;42 pfds0.events = POLLIN;43 /添加标准输入描述符44 pfds1.fd = STDIN_FILENO;45 pfds1.events = POLLIN;46 for (; ;)47 48 poll(pfds,2,-1);49 if (pfds0.revents & POLLIN)50 51 n = read(sockfd,recvline,MAXLINE);52 if (n = 0)53 54 fprintf(stderr,client: server is closed.n);55 close(sockfd);56 57 write(STDOUT_FILENO,recvline,n);58 59 /测试标准输入是否准备好60 if (pfds1.revents & POLLIN)61 62 n = read(STDIN_FILENO,sendline,MAXLINE);63 if (n = 0)64 65 shutdown(sockfd,SHUT_WR);66 continue;67 68 write(sockfd,sendline,n);69 70 71 4、程序测试结果iOS多线程的初步研究(一) 对于多线程的开发,iOS系统提供了多种不同的接口,先谈谈iOS多线程最基础方面的使用。产生线程的方式姑且分两类,一类是显式调用,另一类是隐式调用。一、显示调用的类为NSThread。一般构造NSThread的线程对象可通过两种方式:1. 初始化线程主方法:NSThread detachNewThreadSelector:selector(run:) toTarget:target withObject:obj;/类方法或NSThread *newThread = NSThread alloc initWithTarget:target selector:selector(run:) object:obj; /实例方法可以拿到线程对象,便于以后终止线程。2. 定义NSThread的子类MyThread,然后实现main方法(即方法1中的run)。然后创建新对象:MyThread *newThread = MyThread alloc init;启动线程:newThread start;终止线程:实际上没有真正提供终止线程的api,但有个方法可以方便地利用cancel方法; 它是改变线程运行的一个状态标志,我们可以这样来利用:先在run:或main方法中这样实现线程循环:- (void)main / thread init while (!NSThreadcurrentThreadisCancelled) / thread loop NSThreadsleepForTimeInterval:1.0; /等同于sleep(1.0); / release resources of thread这时如果调用newThread cancel; 就可以终止线程循环了。NSThread有个类方法exit是用于立即结束当前线程的运行(有点鲁莽),因为无法保证当前线程对资源的释放,所以不推荐使用。二、隐式调用通过NSObject的Category方法调用,罗列如下:- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait; /在主线程中运行方法,wait表示是否阻塞这个方法的调用,如果为YES则等待主线程中运行方法结束。一般可用于在子线程中调用UI方法。- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait; /在指定线程中执行,但该线程必须具备NSRunLoop。- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg; /隐含产生新线程。三、NSThread的其它一些常用的方法创建的线程是非关联线程(detached thread),即父线程和子线程没有执行依赖关系,父线程结束并不意味子线程结束。1.+ (NSThread *)currentThread; /获得当前线程2.+ (void)sleepForTimeInterval:(NSTimeInterval)ti; /线程休眠3.+ (NSThread *)mainThread; /主线程,亦即UI线程了4.- (BOOL)isMainThread;+ (BOOL)isMainThread; /当前线程是否主线程5.- (BOOL)isExecuting; /线程是否正在运行6. - (BOOL)isFinished; /线程是否已结束四、一些非线程调用(NSObject的Category方法)即在当前线程执行,注意它们会阻塞当前线程(包括UI线程):- (id)performSelector:(SEL)aSelector;- (id)performSelector:(SEL)aSelector withObject:(id)object;- (id)performSelector:(SEL)aSelector withObject:(id)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农业废弃物资源化利用政策咨询创新创业项目商业计划书
- 教师招聘之《幼儿教师招聘》复习试题带答案详解
- 押题宝典教师招聘之《小学教师招聘》考试题库附答案详解【达标题】
- 微型企业面试高频题答题技巧及答案详解1套
- 教师招聘之《小学教师招聘》练习题附完整答案详解(必刷)
- 2025年四川天府新区党工委管委会工作机构所属事业单位选调10人笔试备考题库及参考答案详解一套
- 2025年教师招聘之《幼儿教师招聘》考试题库带答案详解(模拟题)
- 2025年北京银行长沙分行社会招聘笔试备考题库及答案解析
- 合肥市非国有博物馆的现状、困境与发展路径研究
- 2025年泌尿外科手术技术操作模拟考核答案及解析
- 《大数据导论(第2版)》全套教学课件
- 小学数学教学中数形结合思想的应用
- 职业病防护设施与个体防护用品的使用和维护
- 统编版语文四年级上册第三单元 连续细致观察 准确生动表达单元任务群整体公开课一等奖创新教学设计
- 【部编版】新人教小学语文五年级上册-中华成语千字文(打印稿)
- 小区物业服务投标方案(技术标)
- 电力营销考试题库
- (正式版)HGT 6313-2024 化工园区智慧化评价导则
- 智鼎在线测评题库答案2024
- 高等数学绪论课件
- 《生产部月报模板》课件
评论
0/150
提交评论