select函数负责监听3个读文件描述符,两个是管道,还有一个是标准输入。管道接收到了就显示在屏幕上,标准输入如果是q就退出。select使用在上一篇博客中。
代码:
#include <sys/types.h>
#include <sys/stat.h>#include <fcntl.h>
#include <unistd.h>
#include <sys/time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FIFO_1 "/tmp/fifo_1"
#define FIFO_2 "/tmp/fifo_2"
int main()
{
fd_set rfd;
int fd1;
int fd2;
int ret;
int max_fd;
char buf[100];
struct timeval tv;
unlink(FIFO_1);
unlink(FIFO_2);
FD_ZERO(&rfd);//文件描述符集清零
FD_SET(STDIN_FILENO,&rfd);//加入该文件描述符
max_fd = STDIN_FILENO;
if((mkfifo(FIFO_1,0666)) == -1)//建立两个管道
{
printf("mkfifo1 error\n");
exit(1);
}
if((mkfifo(FIFO_2,0666)) == -1)
{
printf("mkfifo2 error\n");
exit(1);
}
fd1 = open(FIFO_1,O_RDONLY);//打开管道,需要另一边也打开那不然就会阻塞
if(fd1 == -1)
{
printf("open fifo1 error\n");
exit(1);
}
FD_SET(fd1,&rfd);
if(max_fd < fd1)
{
max_fd = fd1;
}
fd2 = open(FIFO_2,O_RDONLY);
if(fd2 == -1)
{
printf("open fifo2 error\n");
exit(1);
}
FD_SET(fd2,&rfd);
if(max_fd < fd2)
{
max_fd = fd2;
}
max_fd++;
while(1)
{
FD_ZERO(&rfd);//每一次都要清空文件描述符集,重新装入
FD_SET(STDIN_FILENO,&rfd);
FD_SET(fd1,&rfd);
FD_SET(fd2,&rfd);
tv.tv_sec = 10;
tv.tv_usec = 0;
ret = select(max_fd,&rfd,NULL,NULL,&tv);//监测
if(-1 == ret)
{
printf("select error\n");
exit(1);
}
else if(FD_ISSET(STDIN_FILENO,&rfd))//判断是不是标准输入的变化
{
fgets(buf,100,stdin);
printf("buf = %s",buf);
if(strncmp(buf,"q",1) == 0)
{
printf("quit\n");
break;
}
}
else if(FD_ISSET(fd1,&rfd))
{
read(fd1,buf,100);
printf("read1:%s\n",buf);
}
else if(FD_ISSET(fd2,&rfd))
{
read(fd2,buf,100);
printf("read2:%s\n",buf);
}
else
{
printf("等待....\n");
}
//memset(buf,0,100);
}
return 0;
}
一个在努力中的未来程序员,如果有更好的想法,欢迎评论。