非阻塞的c/s,epoll服务器模型

Posted 药剂学徒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了非阻塞的c/s,epoll服务器模型相关的知识,希望对你有一定的参考价值。

epoll

#include <stdio.h>
#include <stdlib.h>
#include <sys/epoll.h>
#include <errno.h>
#include <unistd.h>

#define MAXLINE 10

int main(int argc, char *argv[])
{
    int efd, i;
    int pfd[2];
    pid_t pid;
    char buf[MAXLINE], ch = ‘a‘;

    pipe(pfd);
    pid = fork();

    if (pid == 0) {
        close(pfd[0]);
        while (1) {
            for (i = 0; i < MAXLINE/2; i++)
                buf[i] = ch;
            buf[i-1] = ‘\n‘;
            ch++;
            for (; i < MAXLINE; i++)
                buf[i] = ch;
            buf[i-1] = ‘\n‘;
            ch++;
            write(pfd[1], buf, sizeof(buf));
            sleep(2);
        }
        close(pfd[1]);
    }
    else if (pid > 0) {
        struct epoll_event event;
        struct epoll_event resevent[10];
        int res, len;
        close(pfd[1]);
        efd = epoll_create(10);
        /* ET 边沿触发 ,默认是水平触发 */
        event.events = EPOLLIN | EPOLLET;
        /* event.events = EPOLLIN; */
        event.data.fd = pfd[0];
        epoll_ctl(efd, EPOLL_CTL_ADD, pfd[0], &event);
        while (1) {
            res = epoll_wait(efd, resevent, 10, -1);
            printf("res %d\n", res);
            if (resevent[0].data.fd == pfd[0]) {
                len = read(pfd[0], buf, MAXLINE/2);
                write(STDOUT_FILENO, buf, len);
            }
        }
        close(pfd[0]);
        close(efd);
    }
    else {
        perror("fork");
        exit(-1);
    }

    return 0;
}

  

以上是关于非阻塞的c/s,epoll服务器模型的主要内容,如果未能解决你的问题,请参考以下文章

典型I/O模型——阻塞IO,非阻塞IO,信号驱动IO,异步IO,IO多路转接(select&poll&epoll)

linux基础编程:IO模型:阻塞/非阻塞/IO复用 同步/异步 Select/Epoll/AIO(转载)

[杂烩]Windows IOCP与Linux的epoll机制对比

五种系统IO模型以及select/poll/epoll原理与使用教程(附带Reactor介绍)

五种高阶IO模型以及多路转接技术(selectpoll和epoll)及其代码验证

五种高阶IO模型以及多路转接技术(selectpoll和epoll)及其代码验证