ch05:進階檔案操作

來源:互聯網
上載者:User
 

第五講 進階檔案操作#include <fcntl.h>#include <stdio.h>#include <unistd.h> int main(){       int fds[2];       char buf[4096];       int i, fd;              if ((fds[0] = open("p1",O_RDONLY)) < 0)       {              perror("open");              return 1;       }        if (fds[1] = open("p2",O_RDONLY) < 0)       {              perror("open p2");              return 1;       }        fd = 0;       while (1)       {              i = read(fds[fd],buf,sizeof(buf) - 1);              if (i < 0)              {                     perror("read");                     return 1;               }              else if (!i)              {                     printf("pipe close/n");                     return 0;              }                            buf[i] = '/0';              printf("read:%s", buf);              fd = (fd + 1) % 2;       }        return 0;}[root@localhost tmp]mknod p1 p[root@localhost tmp]mknod p2 p[root@localhost tmp]gcc –o mpxb1 mpxb1.c[root@localhost tmp]./mpxb1 // 在終端一中運行[root@localhost tmp]cat > p1 // 在終端二中運行test1[root@localhost tmp]cat > p2 // 在終端三中運行test2[root@localhost tmp]./mpxb1 // 在終端一中運行read:test1對於test2不能顯示啊多路輸入輸出#include <sys/poll.h>int poll(struct pollfd *fds, int numfds, int timeout);struct pollfd{       int fd;       short events;       short revents;}POLLIN, POLLPRI, POLLOUT, POLLERR, POLLHUP, POLLNVAL例#include <fcntl.h>#include <stdio.h>#include <sys/poll.h>#include <unistd.h> int main(){       struct pollfd fds[2];       char buf[4096];       int i, rc;              if ((fds[0].fd = open("p1", O_RDONLY|O_NONBLOCK)) < 0)       {              perror("open p1");              return 1;:        }              if ((fds[1].fd = open("p2", O_RDONLY | O_NONBLOCK)) < 0)       {              perror("open p2");              return 0;       }              fds[0].events = POLLIN;       fds[1].events = POLLIN;              while (fds[0].events || fds[1].events)       {              if (poll(fds, 2, 0))              {                     perror("poll");                     return 1;              }                            for (i = 0; i < 2; i++)              {                     if (fds[i].revents)                     {                            rc = read(fds[i].fd, buf, sizeof(buf) - 1);                                                        if ( rc < 0 )                            {                                   perror("read");                                   return 1;                            }                            else if (!rc)                            {                                   fds[i].events = 0;                            }                            else                             {                                   buf[rc] = '/n';                                   printf("read:%s", buf);                            }                     }              }       }            return 0;} #include <sys/select.h>int select(int numfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);FD_ZERO(fd_set *fds); FD_SET(int fd, fd_set *fds);FD_CLR(int fd, fd_set *fds); FD_ISSET(int fd, fd_set *fds);#include <sys/time.h>struct timeval{       int tv_sec;       int tv_usec;}例#include <fcntl.h>#include <stdio.h>#include <sys/select.h>#include <unistd.h> int main(void){       int fds[2];       char buf[4096];       int i, rc, maxfd;       fd_set watchset;       fd_set inset;        if (fds[0] = open("p1", O_RDONLY | O_NONBLOCK) < 0)       {              perror("open p1");              return 1;       }             if (fds[1] = open("p2", O_RDONLY | O_NONBLOCK) < 0)       {              perror("open p2");              return 1;       }        FD_ZERO(&watchset);       FD_SET(fds[0], &watchset);       FD_SET(fds[1], &watchset);        maxfd = fds[0] > fds[1] ? fds[0] : fds[1];       while (FD_ISSET(fds[0], &watchset) || FD_ISSET(fds[1], &watchset))       {              inset = watchset;              if (select( maxfd + 1, &inset, NULL, NULL, NULL) < 0)              {                     perror("select");                     return 1;              }                            for ( i = 0; i < 2; i++)              {                     if(FD_ISSET(fds[i], &inset))                     {                            rc = read(fds[i], buf, sizeof(buf) - 1);                            if (rc < 0)                            {                                   perror("read");                                   return 1;                            }                            else if (!rc)                            {                                   close(fds[i]);                                   FD_CLR(fds[i], &watchset);                            }                            else                            {                                   buf[rc] = '/0';                                   printf("read:%s", buf);                            }                     }              }       }        return 0;}比較poll()和select()例#include <fcntl.h>#include <stdio.h>#include <stdlib.h>#include <sys/select.h>#include <sys/poll.h>#include <unistd.h>#include <signal.h> int gotAlarm; void catch(int sig){       gotAlarm = 1;} #define HIGH_FD 1000 int main( int argc ,const char *argv){       int devZero;       int count;       fd_set selectFds;       struct pollfd pollfds;              devZero = open("dev/zero",O_RDONLY);       dup2(devZero, HIGH_FD);       signal(SIGALRM, catch);              gotAlarm = 0;       count = 0;       alarm(1);       while (!gotAlarm)       {              FD_ZERO(&selectFds);              FD_SET(HIGH_FD, &selectFds);              select(HIGH_FD + 1, &selectFds, NULL, NULL, NULL);              count++;       }       printf("select() calls per second :%d/n", count);              pollfds.fd = HIGH_FD;       pollfds.events = POLLIN;       count = 0;       gotAlarm = 0;       alarm(1);       while (!gotAlarm)       {              poll(&pollfds, 0, 0);              count++;       }       printf("poll() calls per second :%d/n", count);               return 0;} #include <sys/epoll.h>int epoll_create(int numDescriptors);int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);struct epoll_event{       union{              void *ptr;              int fd;              unsigned int u32;              unsigned long long u64;} data;}EPOLLIN, EPOLLOUT, EPOLLPRIEPOLL_CTL_ADD, EPOLL_CTL_DEL, EPOLL_CTL_MODread和write的替代例#include <sys/uio.h>struct iovec{void *iov_base;void *iov_len;};int readv(int fd, const struct iovec *vector, sieze_t count);int writev(int fd, const struct iovec *vector, size_t count);例#include <unistd.h>#include <stdio.h>#include <sys/uio.h> int main(){       struct iovec buffers[3];        buffers[0].iov_base = "hello";       buffers[0].iov_len = 5;       buffers[1].iov_base = " ";       buffers[1].iov_len = 1;       buffers[2].iov_base = "world/n";       buffers[2].iov_len = 6;        writev(1,buffers, 3);              return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.