Я некоторое время работаю над этим фрагментом кода, и по какой-то причине опрос возвращает ноль, даже если есть данные, которые нужно прочитать из трубы outFds. По какой-то причине, если я читаю некоторые данные и затем запускаю опрос, он возвращает правильное значение, но это не решение. Кто-нибудь видел это раньше и знал, что я должен делать?Опрос возвращает 0, но чтение не блокируется
#include <stdio.h>
#include <stdlib.h>
#include <sys/poll.h>
int main(void)
{
int outFds[2];
pipe(outFds);
if(!fork()) {
dup2(outFds[1], 1);
close(outFds[0]);
close(outFds[1]);
// disable printf buffering
setvbuf(stdout, NULL, _IONBF, 0);
sleep(1);
char buf[32];
printf("blah");
exit(0);
}
close(outFds[1]);
char c;
// Read 'b' into c. If this next line is not commented poll returns 1
//read(outFds[0], &c, 1);
struct pollfd outFd;
outFd.fd = outFds[0];
outFd.events = POLLIN;
printf("%d\n", poll(&outFd, 1, 0)); // poll returns 0 for some reason
}
Кажется, что вы 'poll', прежде чем ребенок написал в трубу. Вы пытались поставить еще «sleep» перед «poll»? – 5gon12eder
"Опрос возвращает ноль, несмотря на то, что есть данные, которые нужно прочитать из трубы outFds". Откуда вы знаете, что есть данные для чтения? Ничто в коде не гарантирует, что дочерний 'printf' выполняется перед родительским' poll'. Тем более, что у вас есть «спать» у ребенка до вызова 'printf'. Таким образом, мои деньги на 'poll' ведут себя правильно, и ваше предположение неверно. – kaylum
Спасибо Алан! Теперь я вижу, что спал не в том месте, и это объясняет, почему чтение в байте фиксировало проблему. Я как-то забыл, что читает блоки ха-ха. – Daniel