Unix环境高级I/O(Select)

原创 2006年05月25日 09:12:00

1         Unix环境高级I/OSelect

允许进程高数内核等待多种I/O事件中的任何一种出现,并且进当这些时间中的一个或多个出现时,或这指定的时间已过去时才唤醒调用进程。因此函数有如下两种作用:

1. 等待多个I/O

2. 设置I/O操作超时

1.1        数据结构定义

#include <sys/time.h>

 

Struct timeval {

       Time_t          tv_sec;    //second

       Suseconds_t   tv_usec;  //microseconds

}

1.2        API

2.1 #include <semaphore.h>

多路I/O

int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,  struct timeval *timeout);

返回: -1出现错误。0 在描述字就绪前时间到。正整数,就绪描述字个数

 

第一个参数n, 指明要被测试描述字个数,他的值是要被测试的最大描述符加1Readfds, writefds, exceptfds,分别给出我们要求内核测试读,写,和例外条件的描述字集合。描述字集合类型为fd_set,由下面几个函数使用。这3个参数任意一个豆科一时空指针。当3个参数都为空时, select函数为定时器,其精度高于sleep。最后一个参数timeout,告诉内核等待指定描述府多长时间。分三种情况:

永远等待。无时间限制,仅当指定的描述字种有I/O就绪时才返回。Timeout 为空。

等待固定一段时间。等待时间由timeout参数指定

不等待。Timeout所指timeval结构体成员均为0

2.2 #include <semaphore.h>

描述字属性集合操作宏

初始描述字集合fdset为空

void FD_ZERO(fd_set* fdset);

无返回

fileds从描述字集合fdset种清除

void FD_CLR(int filedes, fd_set* fdset);

无返回

判断filedes属于fdset

int FD_ISSET(int fileds, fd_set* fdset);

返回:是返回非0,否0

filedes加到描述字集合中

void FD_SET(int filedes, fd_set* fdset);

无返回

 

1.3        Example

#include <stdio.h>

#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

Int main(void) {
    fd_set rfds;
   
struct timeval tv;
   
int retval;

/* Watch stdin (fd 0) to see when it has input. */

FD_ZERO(&rfds);
     FD_SET(0, &rfds);

     /* Wait up to five seconds. */
     tv.tv_sec = 5;
     tv.tv_usec = 0;

     retval = select(1, &rfds, NULL, NULL, &tv);

     /* Don't rely on the value of tv now! */

     if (retval == -1)
         perror("select()");
     else if (retval)
         printf("Data is available now./n");

     /* FD_ISSET(0, &rfds) will be true. */

     Else
          printf("No data within five seconds./n");

    return 0;

}

 

UNIX环境高级编程--高级I/O(三)

一、高级I/O        mmap()函数的使用       #include   void * mmap(void *addr,size_t len,int port,int flags,in...
  • yusiguyuan
  • yusiguyuan
  • 2013年09月24日 22:53
  • 1478

【Linux】I/O多路转接select

系统提供select函数来实现多路复用输入/输出模型,那为什么提供select函数?select高效的原因首先要知道一个概念,一次I/O分两个部分(①等待数据就绪 ②进行I/O),减少等待数据的的比重...
  • wenqiang1208
  • wenqiang1208
  • 2017年06月05日 22:03
  • 198

Unix环境高级编程学习笔记(九) 高级IO

fcntl 记录锁 很多时候,当我们有多个进程要访问同一个文件的时候,为了防止多进程访问导致的不一致,我们就要考虑进程间的同步问题了。fcntl是一个非常强大的函数,在这里我们可以使用它来给文件...
  • justaipanda
  • justaipanda
  • 2012年08月28日 17:30
  • 5976

select函数与I/O多路转接

select函数与I/O多路转接 相作大家都写过读写IO操作的代码,例如从socket中读取数据可以使用如下的代码: while( (n = read(so...
  • linyt
  • linyt
  • 2007年08月02日 13:48
  • 5282

UNIX环境高级编程--文件I/O(一)

这里讲述的I/O包括四部分的:文件I/O、标准I/O库、高级I/O,终端I/O。这四部分在《unix环境高级编程》中是分开的三章,这里提取放在一块说更有课比性。 一、文件I/O            ...
  • yusiguyuan
  • yusiguyuan
  • 2013年09月24日 07:57
  • 2647

unix环境高级编程-5.8-标准I/O的效率。

使用上一节所述的函数。我们能对标准的I/O的效率有所了解。 请看下面的程序 #include "apue.h" int main(void) { int c; while((c=getc...
  • wallwind
  • wallwind
  • 2011年11月06日 21:57
  • 978

Socket编程实践(8) --Select-I/O复用

五种I/O模型介绍(1)阻塞I/O[默认]   当上层应用App调用recv系统调用时,如果对等方没有发送数据(Linux内核缓冲区中没有数据),上层应用Application1将阻塞;当对等方发送了...
  • hanqing280441589
  • hanqing280441589
  • 2015年03月14日 15:32
  • 3340

Linux网络编程——I/O复用之select详解

一、I/O复用概述 I/O复用概念: 解决进程或线程阻塞到某个 I/O 系统调用而出现的技术,使进程不阻塞于某个特定的 I/O 系统调 I/O复用使用的场合: 1.当客户处理多个描...
  • lianghe_work
  • lianghe_work
  • 2015年06月15日 17:46
  • 2479

<<UNIX环境高级编程>>随书代码的打开方式

最近在学习>这本书,这本书里有好多包含代码的例子.自己打代码,太费事了,就从网上下,地址是:http://www.apuebook.com/          代码下载了,然后看到书上的第1个例子--...
  • u014804795
  • u014804795
  • 2015年12月08日 22:28
  • 526

I/O复用 select模型使用实例

在这两篇文章基础上 http://blog.csdn.net/qq_26437925/article/details/51898120http://blog.csdn.net/qq_26437925...
  • qq_26437925
  • qq_26437925
  • 2016年08月04日 16:00
  • 289
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unix环境高级I/O(Select)
举报原因:
原因补充:

(最多只允许输入30个字)