涂鸦-草稿:select简单示例
注:本文程序来自《Unix-Linux编程实践教程》一书,以下代码为我自己试验所写。
A Sample – Select:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/time.h>
#include <sys/types.h>
#define oops(m, x) {perror(m);exit(x);}
int main(int ac, char *av[])
{
int fd1, fd2;
struct timeval timeout;
fd_set readfds;
int maxfd;
int retval;
if (ac != 4) {
fprintf(stderr, "usage: %s file file timeout", *av);
exit(1);
}
if ((fd1 = open(av[1], O_RDONLY)) == -1)
oops(av[1], 2);
if ((fd2 = open(av[2], O_RDONLY)) == -1)
oops(av[2], 3);
fprintf(stdout, "fd1 is %d\n", fd1);
fprintf(stdout, "fd2 is %d\n", fd2);
maxfd = 1 + (fd1>fd2?fd1:fd2);
while (1) {
FD_ZERO(&readfds);
FD_SET(fd1, &readfds);
FD_SET(fd2, &readfds);
timeout.tv_sec = atoi(av[3]);
timeout.tv_usec = 0;
retval = select(maxfd, &readfds, NULL, NULL, &timeout);
if (retval == -1)
oops("select", 4);
if (retval > 0) {
if (FD_ISSET(fd1, &readfds))
showdata(av[1], fd1);
if (FD_ISSET(fd2, &readfds))
showdata(av[2], fd2);
}
else
fprintf(stdout, "no input after %d seconds\n", atoi(av[3]));
}
return 0;
}
void showdata(char *fname, int fd)
{
char buf[1024];
int n;
fprintf(stdout, "fname is:%s\n", fname);
n = read(fd, buf, 1024);
if (n == -1)
oops(fname, 5);
char info[] = "info is : ";
write(1, info, strlen(info));
write(1, buf, n);
write(1, "\n", 1);
}
现在开两个终端:
[kk@localhost ~]$ tty
/dev/pts/9
[kk@localhost ~]$ tty
/dev/pts/11
[kk@localhost ~]$ ./selectdemo /dev/pts/9 /dev/pts/11 3
fd1 is 3
fd2 is 4
no input after 3 seconds
……
尝试在不同终端输入一些命令试下~
关键点:
fd_set xxx
FD_ZERO(&xxx)
FD_SET(fd, &xxx)
FD_ISSET(fd, &xxx)
select(maxfds, &xxx, NULL, NULL, &timeval-struct)