linux网络编程select,Linux网络编程学习之select详细讲解

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

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

#include

#include

int main(int argc, char ** argv)

{

char buf[10] = "";

read(0, buf, 9); /* 从标准输入 0 读入字符 */

fprintf(stdout, "%s\n", buf); /* 向标准输出 stdout 写字符 */

return 0;

}

/* **上面和下面的代码都可以用来从标准输入读用户输入的9个字符** */

#include

#include

#include

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结构如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值