Chinaunix首页 | 论坛 | 博客
  • 博客访问: 78501
  • 博文数量: 25
  • 博客积分: 416
  • 博客等级: 一等列兵
  • 技术积分: 205
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-23 21:01
文章分类

全部博文(25)

文章存档

2013年(8)

2012年(17)

我的朋友

分类: LINUX

2012-03-17 01:26:35

例子:

  1. {

  2. int fd;

  3. char *a = "/dev/tty";

  4. struct termios tty,savetty;

  5. fd=open(a,O_RDONLY|O_NONBLOCK);

  6. tcgetattr(fd,&tty);

  7. savetty = tty;

  8. tty.c_lflag &= ~(ECHO|ICANON);

  9. tty.c_cc[VMIN] = 0;   //VMIN&VTIME=0当需要从终端获得字符时候,立即返回

  10. tty.c_cc[VTIME] = 0;

  11. tcsetattr(fd,TCSAFLUSH,&tty);

  12. tcsetattr(fd,TCSAFLUSH,&savetty);

  13. close(fd);

  14. }

‘read()’函数行为的控制;它们是‘VMIN’和‘VTIME’。

这些索引名字经常被提及的方式会让人以为它们是实在的变量,比如“设置

VMIN为1” 其实意味着“设置c_cc[VMIN]为1”。这种简写是有用的并且只是

偶尔引起误会。

‘c_cc’的很多变量位置只有当其它标志被设定时才会用到。

只有‘ICANON’被设置,才用到以下变量:

‘VEOF’,‘VEOL’,‘VERASE’,‘VKILL’(如果定义了而且

‘IEXTEN’被设定,那么‘VEOL2’,‘VSTATUS’和‘VWERASE’

也用到)

只有‘ISIG’被设置,才用到以下变量:

‘VINTR’,‘VQUIT’,‘VSUSP’(如果定义了而且‘IEXTEN’被设定,

那么‘VDSUSP’也用到)

只有‘IXON’或‘IXOFF’被设置,才用到以下变量:

‘VSTOP’,‘VSTART’

只有‘ICANON’被取消,才用到以下变量:

‘VMIN’,‘VTIME’

不同系统实现会定义增加的‘c_cc’变量。谨慎的做法是在设定你希望使用的值

以前,使用‘_POSIX_VDISABLE’初始化这些变量(常量‘NCCS’提供这个数

组的大小)

‘VMIN’和‘VTIME’(根据不同的实现方法,它们有可能和‘VEOF’和‘VEOL’

分享相同两个变量)具有以下含义。‘VTIME’的值(如果不为0)总是被解释为以十

分之一秒为单位的计时器)(译者注:VTIME变量是一个字节长,所以1表示0.1秒,

最大为255,表示25.5秒)

****c_cc[VMIN] > 0, c_cc[VTIME] > 0'

只要输入已经有VMIN字节长,或者输入至少有一个字符而在读取最后一个字

符之前VTIME已经过期,或者被信号中断,‘read()’将返回。

****c_cc[VMIN] > 0, c_cc[VTIME] == 0'

只要输入已经有VMIN字节长,或者被信号中断,‘read()’将返回。否则,将

无限等待下去。

****c_cc[VMIN] == 0, c_cc[VTIME] > 0'

只要有输入‘read()’就返回;如果VTIME过期却没有数据,它会返回没有读

到字符。(这和调制解调器挂断时的文件结束标志有一点冲突;使用1作为VMIN,

调用‘alarm()’或‘select()’函数并给定超时参数可以避免这个问题。)

****c_cc[VMIN] == 0, c_cc[VTIME] == 0'

‘read()’总是立刻返回;如果没有数据则返回没有读到字符。(与上面的问题

相同)

 

其中cc_t c_line只有在一些特殊的系统程序(比如,设置通过tty设备来通信的网络协议)中才会用。在数组c_cc中有两个下标(VTIME和VMIN)对应 的元素不是控制符,并且只是在原始模式下有效。只有在原始模式下,他们决定了read()函数在什么时候返回。在标准模式下,除非设置了 O_NONBLOCK选项,否则只有当遇到文件结束符或各行的字符都已经编辑完毕后才返回。

 

控制符VTIME和VMIN之间有着复杂的关系。VTIME定义要求等待的零到几百毫秒的时间量(通常是一个8位的unsigned char变量,取值不能大于cc_t)。VMIN定义了要求等待的最小字节数(不是要求读的字节数——read()的第三个参数才是指定要求读的最大字节数),这个字节数可能是0

 

l 如果VTIME取0,VMIN定义了要求等待读取的最小字节数。函数read()只有在读取了VMIN个字节的数据或者收到一个信号的时候才返回。

 

l 如果VMIN取0,VTIME定义了即使没有数据可以读取,read()函数返回前也要等待几百毫秒的时间量。这时,read()函数不需要像其通常情况那样要遇到一个文件结束标志才返回0。

 

l 如果VTIME和VMIN都不取0,VTIME定义的是当接收到第一个字节的数据后开始计算等待的时间量。如果当调用read函数时可以得到数据,计时器 马上开始计时。如果当调用read函数时还没有任何数据可读,则等接收到第一个字节的数据后,计时器开始计时。函数read可能会在读取到VMIN个字节 的数据后返回,也可能在计时完毕后返回,这主要取决于哪个条件首先实现。不过函数至少会读取到一个字节的数据,因为计时器是在读取到第一个数据时开始计时 的。

 

l 如果VTIME和VMIN都取0,即使读取不到任何数据,函数read也会立即返回。同时,返回值0表示read函数不需要等待文件结束标志就返回了。


stolen from:http://blog.sina.com.cn/s/blog_644f3cb40100sjs4.html


many thanks

详见APUE第18章中断I/O



阅读(2892) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~