Warum signalisiert Epoll Epollin nicht für anonyme Rohr, wenn alle Schreibenden geschlossen wurden?Linux

Linux verstehen
Anonymous
 Warum signalisiert Epoll Epollin nicht für anonyme Rohr, wenn alle Schreibenden geschlossen wurden?

Post by Anonymous »

Warum wird Epollin nicht signalisiert, dass Epollin für eine anonyme Pipe -Lese -End nicht signalisiert, wenn alle Schreibenden geschlossen wurden und es keine Daten mehr zum Lesen gibt? Dies scheint sich vom Verhalten zu unterscheiden, wobei TCP -Sockets geschlossen werden und mit meinem Verständnis von Epollin signalisiert werden, wenn ein Lesedaten unter normalen Umständen nicht blockiert wird. Ich verstehe, dass Epollhup signalisiert wird, wenn das Schreibende geschlossen ist, aber ich bin mir nicht sicher, ob es der beste Weg ist, Dinge zu tun?

Code: Select all

#include 
#include 
#include 
#include 
#include 
#include 
#include 

int main(void) {
int pipefd[2];
if (pipe(pipefd)) {
perror("pipe");
}
signal(SIGCHLD, SIG_IGN);
pid_t pid = fork();
if (pid == 0) {
close(pipefd[0]);
for (int i = 0; i < 2'000'000; i++) {
write(pipefd[1], "a", 1);
}
close(pipefd[1]);
exit(0);
}
close(pipefd[1]);
int epollfd = epoll_create(1);
struct epoll_event event = {};
event.events = EPOLLIN;
event.data.fd = pipefd[0];
epoll_ctl(epollfd, EPOLL_CTL_ADD, pipefd[0], &event);
struct epoll_event events[100];
while (true) {
int event_count = epoll_wait(epollfd, events, sizeof(events)/sizeof(*events), -1);
for (int i = 0; i < event_count; i++) {
int fd = events[i].data.fd;
if (events[i].events & EPOLLIN) {
printf("fd %d can be read without blocking (supposedly).\n", fd);
char buf[8192];
ssize_t readb = read(fd, buf, sizeof(buf));
if (readb == 0) {
printf("Finished reading pipe");
break;
}
if (readb < 0) {
printf("Error reading pipe");
break;
}
printf("Read %zd bytes: '%.*s'\n", readb, (int) readb, buf);
}
}
}
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post