Насчёт получения только одной строки из ожидаемого множества. Тут уже немного зыбкая почва. Не пробовал. Точнее, не пробовал именно так. По-другому я делал. у меня тоже была проблема - приходила только одна строка, потом был длительный таймаут, потом я просил ещё рез и тут приходила куча - и задержавшиеся сообщения, и новые. Но это потому программа основывалась на QProcess и там странно организована работа с пайпами. Поскольку в данном случае всё "своё", надо подумать... Может дело в самих пайпах, а может, в неправильной работе в ними.
Как вариант 1: может, надо добавить флаг MSG_WAITALL в recv()?
Как вариант 2: Работайте с select.
Вот кусок моего старого кода от логгера:
Код:
do {
...
//listen child error messages
if (!bPipeIsBroken)
{
//starts listen child
fd_set rfds;
struct timeval tv;
int retval;
FD_ZERO(&rfds);
FD_SET(fd[0], &rfds);
tv.tv_sec = 1;
tv.tv_usec = 100;
retval = select(fd[0] + 1, &rfds, NULL, NULL, &tv);
// if (retval == -1) -> broken pipe?
if (retval == -1) break;
// if (retval == 0) -> no data at input
if (retval == 0) continue;
char buffer[512];
ssize_t msg_len = read(fd[0], buffer, 512);
if ((msg_len == -1) || (msg_len == 0))
{
bPipeIsBroken = 1; //$$
//if (g_bVerbouse) printf("Pipe seems to be broken\n"); //$$
continue; //error, but not SIGPIPE //$$
}
buffer[msg_len] = 0;
//Ucop checks only stderr channel.Thus, if program-child will ask something or
//requests input from user, its question will be displayed. Lucky hit!
logger.fprintf("%s", buffer);
}
} while (1);
Очень похоже на [s]man select[/s]. Разберётесь, ладно? Я сейчас занимаюсь очень похожей проблемой, только у меня всё гораздо сложней.
ЗЫ. Нда-с, не совсем понятно. fd[1] - конец трубы, из которой должна идти инфа.
logger - класс логгера, не обращайте внимания.
[s]Исправлено:
hasherfrog, 10:13 10-06-2004[/s]