你的位置:首页 > 操作系统

[操作系统]多路转接之poll和select

先看poll():

 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <sys/stat.h> 5 #include <sys/types.h> 6 #include <fcntl.h> 7 #include <poll.h> 8  9 #define oops(x, n) { perror(x); exit(n); }10 11 int main()12 {13   mkfifo("fifo1", 0644);  14   mkfifo("fifo2", 0644);  15   16   int fd1 = open("fifo1", O_RDWR);17   int fd2 = open("fifo2", O_RDWR);18   char buf[1000];19   for(;;)20   {21     struct pollfd pfd[] = {{0, POLLIN}, {fd1, POLLIN}, {fd2, POLLIN}};22     int ret = poll(pfd, 3, 1);23     if(ret > 0)24     {25       if(pfd[0].revents&POLLIN)26       {27         scanf(" %[^\n]", buf);  28         printf("keypad:%s\n", buf);29         if(strcmp(buf, "quit") == 0) break;  30       }31       if(pfd[1].revents&POLLIN)32       {33         int n = read(fd1, buf, sizeof(buf));  34         buf[n] = '\0';35         printf("fifo1:%s", buf);36       }37       if(pfd[2].revents&POLLIN)38       {39         int n = read(fd2, buf, sizeof(buf));  40         buf[n] = '\0';41         printf("fifo2:%s", buf);42       }43     }44 45   }46   close(fd1);47   close(fd2);48   unlink("fifo1");49   unlink("fifo2");50 51   return 0;52 }

View Code


再来说说select():

 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <sys/stat.h> 5 #include <sys/types.h> 6 #include <fcntl.h> 7 #include <poll.h> 8  9 #define oops(x, n) { perror(x); exit(n); }10 11 int main()12 {13   mkfifo("fifo1", 0644);  14   mkfifo("fifo2", 0644);  15   16   int fd1 = open("fifo1", O_RDWR);17   int fd2 = open("fifo2", O_RDWR);18   char buf[1000];19   for(;;)20   {21     struct pollfd pfd[] = {{0, POLLIN}, {fd1, POLLIN}, {fd2, POLLIN}};22     int ret = poll(pfd, 3, 1);23     if(ret > 0)24     {25       if(pfd[0].revents&POLLIN)26       {27         scanf(" %[^\n]", buf);  28         printf("keypad:%s\n", buf);29         if(strcmp(buf, "quit") == 0) break;  30       }31       if(pfd[1].revents&POLLIN)32       {33         int n = read(fd1, buf, sizeof(buf));  34         buf[n] = '\0';35         printf("fifo1:%s", buf);36       }37       if(pfd[2].revents&POLLIN)38       {39         int n = read(fd2, buf, sizeof(buf));  40         buf[n] = '\0';41         printf("fifo2:%s", buf);42       }43     }44 45   }46   close(fd1);47   close(fd2);48   unlink("fifo1");49   unlink("fifo2");50 51   return 0;52 }

View Code