- 1、本文档共3页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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 是否有数据可读,我们可以这样
您可能关注的文档
最近下载
- 第7课 百家争鸣(课件)统编版(2024)历史七年级上册.pptx VIP
- 新人教小学四年级数学上册《认识公顷》示范教学设计.docx VIP
- 2023年新苏教版三年级上册科学全册知识点梳理(精简版).doc
- 甲状腺激素及肿瘤标志物检测的临床意义.ppt VIP
- (初级)航空油料计量统计员技能鉴定理论考试题库资料(含答案).pdf
- 小学二年级新学期开学家长会PPT课件.pptx
- 汽车吊装t梁施工方案(终).doc
- 2023国考公务员考试笔试系统讲义言语理解与表达.pdf VIP
- 22G101 三维彩色立体图集.docx
- 2025届通用技术一轮复习练习:专题26 比较器及其应用一(非选择题)(含解析).DOCX VIP
文档评论(0)