Здравствуй, ЛОР!
Ткните носом. Осваиваю Си. Застрял в одном месте.
В программе стандартныe вывода (stdout и stderr) одной консольной программы через каналы (pipe) завел в основную программу. Файловые дескрипторы каналов преобразовал в поток даных (FILE*), чтобы обрабатывать их стандартной библиотекой си. События о том, что в каналах появились новые данные обрабатываю в epoll().
Вот кусок кода.
while (1) {
nr_events = epoll_wait (epfd, events, 64, -1);
if (nr_events<0) {
perror ("epoll_wait:");
free (events);
exit(EXIT_FAILURE);
}
if (nr_events >0) {
for (n = 0; n < nr_events; ++n) {
int i =0;
if (events [n].data.fd == 3) {
while ((sym = fgetc (stream_info)) != '\n') {
buff[i++] = sym;
}
buff[i] = '\0';
printf ("STDOUT - %s \n", buff);
}
int k = 0;
if (events [n].data.fd == 5) {
while ((sym = fgetc (stream_err)) != '\n') {
buff_err[k++] = sym;
}
buff_err[k] = '\0';
printf ("STDERR - %s \n", buff_err);
}
}
}
}
В принципе код рабочий, но, если только принимается одна строка. Если в выводе за одно событие больше 2-х строк, вижу только первую. Остаток прочитается при следующем событии. По коду ясно почему так. Не понятно как правильно определить, что в потоке больше нет данных? И как правильно парсить стандартные потоки?