您的位置:首页 > 其它

涂鸦-草稿:select简单示例

2017-06-14 15:09 169 查看

涂鸦-草稿: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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: