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多路转接(select、pselect和poll)

UNIX环境高级编程--标准I/O库(二)

标准I/O库处理很多细节,例如缓冲区分配,以优化长度执行I/O等。 标准I/O库提供缓冲的目的是尽可能减少使用read和write调用的次数。 标准I/O提供了三种类型的缓冲: 1)全缓冲。这种情况下...

《UNIX环境高级编程》---3.文件I/O

一、打开、创建文件、关闭文件 文件描述符:一个非负整数,范围是0~OPEN_MAX-1。内核用它来标识进程正在访问的文件。当进程创建时,默认为它打开了3个文件描述符,它们都链接向终端:0: 标准输入 ...

《UNIX环境高级编程》五标准I/O库读书笔记

1、流和FILE对象 对于标准I/O库,它们的操作是围绕流(stream)进行的。当用标准I/O库打开或创建一个文件时,我们已使一个流与一个文件相关联。fwide函数用于设置流的定向#include...

UNIX环境高级编程(6):文件I/O(2)

文件共享: UNIX系统支持在不同进程间共享打开的文件。内核使用三种数据结构表示打开的文件,他们之间的关系决定了在文件共享方面一个进程对另一个进程可能产生的影响: (1)每个进程在进程表中都有一个记录...

《UNIX环境高级编程》第3章 文件I/O

文件I/O3.1 引言本章开始讨论UNIX系统,先说明可用的文件IO函数——打开文件、读文件、写文件等。大多数文件IO只要用到5个函数:open、read、write、lseek和close。 ...

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

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

unix环境高级编程-5.9-二进制I/O

上一节,我们知道对于读或者写都是一个一个字节,或者一行行的。 getc和putc是通过字节来处理。fputs和fgets是一行的,但是遇到null就停止了。 下面介绍fread和fwrite函数 ...

UNIX环境高级编程学习笔记(二)文件I/O常用函数

不带缓冲I/O

UNIX环境高级编程----标准I/O

一.流:当用标准I/O打开或创建一个文件时,我们使一个流与一个文件相关联,当打开一个流时,标准I/O函数fopen返回一个指向FILE对象的指针,该对象通常是一个结构,它包含了标准I/O库为管理该流所...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unix环境高级I/O(Select)
举报原因:
原因补充:

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