多路IO程序示例

一、select实现

#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
#include <errno.h>
#include <string.h>

#define IN_FILES    3
#define MAX_BUFFER_SIZE 1024
#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((fds[1] = open("in1", O_RDONLY | O_NONBLOCK)) < 0)
    {
        printf("Open in1 error\n");
        return 1;
    }

    if((fds[2] = open("in2", O_RDONLY | O_NONBLOCK)) < 0)
    {
        printf("Open in2 error\n");
        return 1;
    }

    maxfd = MAX(MAX(fds[0], fds[1]), fds[2]);

    FD_ZERO(&inset);
    for(i = 0; i < IN_FILES; i++)
    {
        FD_SET(fds[i], &inset);
    }
    FD_SET(0, &inset);
    tv.tv_sec = TIME_DELAY;
    tv.tv_usec = 0;

    while(FD_ISSET(fds[0], &inset)
          || FD_ISSET(fds[1], &inset) || FD_ISSET(fds[2], &inset))
    {
        tmp_inset = inset;
        res = select(maxfd + 1, &tmp_inset, NULL, NULL, &tv);

        switch(res)
        {
        case -1: // Select error.
            {
                printf("Select error\n");
                return 1;
            }
            break;

        case 0: // Time out
            {
                printf("Time out\n");
                return 1;
            }
            break;

        default:
            {
                for (i = 0; i < IN_FILES; i++)
                {
                    if (FD_ISSET(fds[i], &tmp_inset))
                    {
                        memset(buf, 0, MAX_BUFFER_SIZE);
                        real_read = read(fds[i], buf, MAX_BUFFER_SIZE);

                        if (real_read < 0){
                            if (errno != EAGAIN){
                                return 1;
                            }
                        }
                        else if(real_read == 0){
                            close(fds[i]);
                            FD_CLR(fds[i], &inset);
                        }
                        else{
                            if (i == 0){
                                if ((buf[0] == 'q') || (buf[0] == 'Q')){
                                    return 1;
                                }
                            }
                            else{
                                buf[real_read] = '\0';
                                printf("%s", buf);
                            }
                        }
                    } // End of if
                } // End of for
            }
            break;

        } // End of switch
    } // End of while

    return 0;
}

二、poll实现

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <errno.h>
#include <poll.h>

#define MAX_BUFFER_SIZE 1024
#define IN_FILES 3
#define TIME_DELAY 60
#define MAX(a, b) ((a > b) ? (a) : (b))

int main(void)
{
    struct pollfd fds[IN_FILES];
    char buf[MAX_BUFFER_SIZE];
    int i, res, real_read, maxfd;

    fds[0].fd = 0;
    if ((fds[1].fd = open("in1", O_RDONLY | O_NONBLOCK)) < 0){
        printf("Open in1 error\n");
        return 1;
    }
    
    if ((fds[2].fd = open("in2", O_RDONLY | O_NONBLOCK)) < 0){
        printf("Open in2 error\n");
        return 1;
    }

    for(i = 0; i < IN_FILES; i++){
        fds[i].events = POLLIN;
    }

    while(fds[0].events || fds[1].events || fds[2].events)
    {
        if (poll(fds, IN_FILES, 0) < 0){
            printf("Poll error\n");
            return 1;
        }

        for(i = 0; i < IN_FILES; i++){
            if (fds[i].revents){
                // Try to read data
                memset(buf, 0, MAX_BUFFER_SIZE);
                real_read = read(fds[i].fd, buf, MAX_BUFFER_SIZE);

                if (real_read < 0){
                    if (errno != EAGAIN){
                        return 1;
                    }
                }
                else if (!real_read){
                    close(fds[i].fd);
                }
                else{
                    if (i == 0){
                        if (buf[0] == 'q' || buf[0] == 'Q'){
                            return 1;
                        }
                    }
                    else{
                        buf[real_read] = '\0';
                        printf("%s", buf);
                    }
                } // End of if real_read
            } // End of if revent
        } // End of for
    } // End of while
}

源码摘抄自《嵌入式linux应用程序开发》

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值