例子介绍::
{
int fd;
char *a ="/dev/tty";
struct termios tty,savetty;
fd=open(a,O_RDONLY|O_NONBLOCK);
tcgetattr(fd,&tty);
savetty=tty;
tty.c_lflag&=~(ECHO|ICANON);
tty.c_cc[VMIN]=0; VMIN&VTIME=0 当需要从终端获得字符时候,立即返回
tty.c_cc[VTIME]=0;
tcsetattr(fd,TCSAFLUSH,&tty);
tcsetattr(fd,TCSAFLUSH,&savetty);
close(fd);
}
‘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 函数不需要等待文件结束标志就返回了。 怎样知道我的系统有多少存储器容量?
=====================================
这是另一个‘经常未回答的问题’。在多数情况下,你不该试图去找到答案. 如果你必需得到答案,问题的答案通常是有的,但非常依赖于不同的操作系统。 例如, 在Solaris 中, 可以用****sysconf(_SC_PHYS_PAGES)' 和 ****sysconf(_SC_PAGESIZE)';
在FreeBSD 中,可以用****sysctl()'; 在Linux 中可以通过读取并处理****/proc/meminfo'得 到 (使用该文件时需小心你的程序,它要接受历史上任何不同合法格式). 其它的操作 系统有各自的方式,我也没有意识到更多可移植的方法。
在HP-UX(9 版和10 版)中,可以使用如下的代码:
struct pst_static pst;
if (pstat_getstatic(&pst, sizeof(pst), (size_t) 1, 0) != -1)
{
printf(" Page Size: %lu\n", pst.page_size);
printf("Phys Pages: %lu\n", pst.physical_memory);
}