#include <iostream>
#include <unistd.h>
#include <errno.h>
#include <sys/epoll.h>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
int main() {
const int MAXEVENTS = 1024;
int ret;
int pipe_fd[2];
if ((ret = pipe(pipe_fd)) < 0) {
cout << "create pipe fail:" << ret << ",errno:" << errno << endl;
return -1;
}
struct epoll_event ev;
ev.data.fd = pipe_fd[0];
ev.events = EPOLLIN | EPOLLET;
int epfd = epoll_create(MAXEVENTS);
ret = epoll_ctl(epfd, EPOLL_CTL_ADD, pipe_fd[0], &ev);
if (ret != 0) {
cout << "epoll_ctl fail:" << ret << ",errno:" << errno << endl;
close(pipe_fd[0]);
close(pipe_fd[1]);
close(epfd);
return -1;
}
int pid = fork();
if (pid > 0) {
struct epoll_event events[MAXEVENTS];
int count = epoll_wait(epfd, events, MAXEVENTS, 5000);
char r_buf[100];
for (int i = 0; i < count; i++) {
if ((events[i].data.fd == pipe_fd[0]) && (events[0].events & EPOLLIN)) {
int r_num = read(pipe_fd[0], r_buf, 100);
printf("parrent read num is %d bytes data from the pipe, value is %d \n", r_num, atoi(r_buf));
}
}
close(pipe_fd[1]);
close(pipe_fd[0]);
close(epfd);
cout << "parent close read fd[0], wirte fd[1] and epfd over" << endl;
} else if (pid == 0) {
close(pipe_fd[0]);
cout << "sub does't read, so close read fd[0], over" << endl;
sleep(3);
char w_buf[100];
strcpy(w_buf, "1234");
if (write(pipe_fd[1], w_buf, 5) != -1)
printf("sub write write num 1234, over \n");
close(pipe_fd[1]);
printf("sub close write fd[1] over \n");
} else {
close(pipe_fd[0]);
close(pipe_fd[1]);
close(epfd);
cout << "fork error:" << pid << ", close fds over" << endl;
}
return 0;
}