select實現多路複用
阿新 • • 發佈:2018-12-25
#include #include #include #include #include #include #include #define FIFO1 "in1" #define FIFO2 "in2" #define MAX_BUFFER_SIZE 1024 //緩衝區大小 #define IN_FILES 3 //多路複用輸入檔案數目 #define TIME_DELAY 60 //超時值秒數 #define MAX(a,b) ((a>b)?(a):(b)) int main(void) { int fds[IN_FILES]; //管道描述符 char buf[MAX_BUFFER_SIZE]; int i,res,real_read,maxfd; struct timeval tv; fd_set inset,tmp_inset;//檔案描述符集 fds[0]=0; //終端的檔案描述符 /*建立兩個有名管道*/ if(access(FIFO1,F_OK)==-1) { if((mkfifo(FIFO1,0666)<0)&&(errno!=EEXIST)) { printf("Cannot create fifo1 file\n"); exit(1); } } if(access(FIFO2,F_OK)==-1) { if((mkfifo(FIFO2,0666)<0)&&(errno!=EEXIST)) { printf("Cannot create fifo2 file\n"); exit(1); } } /*以只讀非阻塞方式開啟兩個管道檔案*/ if((fds[1]=open(FIFO1,O_RDONLY|O_NONBLOCK))<0) { printf("Open in1 error\n"); return 1; } if((fds[2]=open(FIFO2,O_RDONLY|O_NONBLOCK))<0) { printf("Open in2 error\n"); return 1; } /*取出兩個檔案描述符中的較大者*/ maxfd=MAX(MAX(fds[0],fds[1]),fds[2]); /*初始化讀集inset,並在讀檔案描述符集中加入相應的描述集*/ FD_ZERO(&inset); /*將inset清零,使集合中不含任何fd*/ for(i=0;i