c_cpp 带有epoll的fifos
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 带有epoll的fifos相关的知识,希望对你有一定的参考价值。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> /* Definition of AT_* constants */
#include <errno.h>
#include <sys/epoll.h>
int main(void) {
int fds[2];
if (mkfifo("./fifo1", 0644) < 0) {
perror("mkfifo()");
};
if (mkfifo("./fifo2", 0644) < 0) {
perror("mkfifo()");
};
if ((fds[0] = open("./fifo1", O_RDONLY|O_NONBLOCK, 0644)) < 0)
perror("open()");
if ((fds[1] = open("./fifo2", O_RDONLY|O_NONBLOCK, 0644)) < 0)
perror("open()");
int epfd;
struct epoll_event ev[2] = {0};
struct epoll_event evlist[2];
epfd = epoll_create(2);
if (epfd == -1) {
perror("epoll_create");
exit(EXIT_FAILURE);
}
ev[0].data.fd = fds[0];
ev[0].events = EPOLLIN;
if (epoll_ctl(epfd, EPOLL_CTL_ADD, fds[0], &ev[0]) == -1) {
perror("epoll_ctl");
exit(EXIT_FAILURE);
}
ev[1].data.fd = fds[1];
ev[1].events = EPOLLIN;
if (epoll_ctl(epfd, EPOLL_CTL_ADD, fds[1], &ev[1]) == -1) {
perror("epoll_ctl");
exit(EXIT_FAILURE);
}
while (1) {
int ready = epoll_wait(epfd, evlist, 2, -1);
if (ready == -1) {
if (errno == EINTR)
continue;
else {
perror("epoll_wait()");
exit(EXIT_FAILURE);
}
}
printf("ready: %d\n", ready);
}
// char buf[4096] = {0};
// ssize_t n;
// ssize_t result;
// size_t remains;
// for (;;) {
// char *p = buf;
// n = 0;
// remains = 4096;
// while (remains > 0) {
// if ((result = read(fds[0], p, remains)) == -1) {
// if (errno == EAGAIN || errno == ETIMEDOUT) {
// sleep(1);
// continue;
// } else {
// perror("read()");
// exit(EXIT_FAILURE);
// }
// }
// n += result;
// remains -= result;
// printf("%s", p);
// p += n;
// }
// }
}
以上是关于c_cpp 带有epoll的fifos的主要内容,如果未能解决你的问题,请参考以下文章
c_cpp epoll.c
c_cpp epoll的系统调用使用示例,C语言
c_cpp client_tcp_epoll.c
c_cpp server_tcp_epoll.c
c_cpp Linux的下epoll的模型实现简单的HTTP服务器
c_cpp OV7670 + FIFO简单数据Test.ino