Linux网络编程学习之select详细讲解.pdf

Linux网络编程学习之select详细讲解.pdf

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linux 网络编程学习之select()详解 select 系统调用是用来让我们的程序监视多个文件句柄(file descriptor)的状态变化的。程序会 停在select 这里等待,直到被监视的文件句柄有某一个或多个发生了状态改变。 文件在句柄在Linux 里很多,如果你man 某个函数,在函数返回值部分说到成功后有一个文 件句柄被创建的都是的,如man socket 可以看到“On success, a file descriptor for the new socket is returned. ”而man 2 open 可以看到“open() and creat() return the new file descriptor ”, 其实文件句柄就是一个整数,看socket 函数的声明就明白了: int socket(int domain, int type, int protocol); 当然,我们最熟悉的句柄是0 、1、2 三个,0 是标准输入,1 是标准输出,2 是标准错误输 出。0 、1、2 是整数表示的,对应的FILE *结构的表示就是stdin、stdout、stderr,0 就是stdin, 1 就是stdout,2 就是stderr 。 比如下面这两段代码都是从标准输入读入9 个字节字符: #include stdio.h #include unistd.h #include string.h int main(int argc, char ** argv) { char buf[10] = ; read(0, buf, 9); /* 从标准输入 0 读入字符 */ fprintf(stdout, %s\n, buf); /* 向标准输出 stdout 写字符 */ return 0; } /* **上面和下面的代码都可以用来从标准输入读用户输入的9 个字符** */ #include stdio.h #include unistd.h #include string.h int main(int argc, char ** argv) { char buf[10] = ; fread(buf, 9, 1, stdin); /* 从标准输入 stdin 读入字符 */ write(1, buf, strlen(buf)); return 0; } 继续上面说的select,就是用来监视某个或某些句柄的状态变化的。select 函数原型如下: int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); 函数的最后一个参数timeout 显然是一个超时时间值,其类型是struct timeval *,即一个struct timeval 结构的变量的指针,所以我们在程序里要申明一个struct timeval tv;然后把变量tv 的 地址tv 传递给select 函数。struct timeval 结构如下: struct timeval { long tv_sec; /* seconds */ long tv_usec; /* microseconds */ }; 第2、3、4 三个参数是一样的类型: fd_set * ,即我们在程序里要申明几个fd_set 类型 的变量,比如rdfds, wtfds, exfds,然后把这个变量的地址rdfds, wtfds, exfds 传递给select 函数。这三个参数都是一个句柄的集合,第一个rdfds 是用来保存这样的句柄的:当句柄的 状态变成可读的时系统就会告诉select 函数返回,同理第二个wtfds 是指有句柄状态变成可 写的时系统就会告诉select 函数返回,同理第三个参数exfds 是特殊情况,即句柄上有特殊 情况发生时系统会告诉select 函数返回。特殊情况比如对方通过一个socket 句柄发来了紧急 数据。如果我们程序里只想检测某个socket 是否有数据可读,我们可以这样

文档评论(0)

yan698698 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档