select()机制中提供一 fd_set 的数据结构, 实际上是一 long 类型的数组, 每一个数组元素都能与一打开的文件句柄 (不管是 socket 句柄, 还是其他文件或命名管道或设备句柄) 建立联系, 建立联系的工作由程序员完成, 当调用 select()时, 由内核根据 IO 状态修改 fd_set 的内容, 由此来通知执行了 select()的进程哪一 socket 或文件可读.
- fd_set set;
- FD_ZERO(&set); /* 将 set 清零使集合中不含任何 fd*/
- FD_SET(fd, &set); /* 将 fd 加入 set 集合 */
- FD_CLR(fd, &set); /* 将 fd 从 set 集合中清除 */
- FD_ISSET(fd, &set); /* 测试 fd 是否在 set 集合中 */
示例:
- #include <stdio.h>
- #include <sys/select.h>
- #include <unistd.h>
- int main(void)
- {
- fd_set fdset;
- FD_ZERO (&fdset);/* 清空集合中所有的元素 */
- FD_SET(STDOUT_FILENO,&fdset);/* 设置 stdout, 使集合中包含 stdout*/
- if(FD_ISSET(STDOUT_FILENO,&fdset)!=0)/* 测试 stdout 是否包含在集合中 */
- printf("stdout has been set\n");
- else
- printf("stdout has not been set\n");
- FD_CLR(STDOUT_FILENO,&fdset);/* 从位向量中清除 stdout*/
- if(FD_ISSET(STDOUT_FILENO,&fdset)!=0)
- printf("stdout has been set\n");/* 再次测试 */
- else
- printf("stdout has not been set\n");
- return 0;
- }
来源: http://www.bubuko.com/infodetail-2741165.html