Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Название темы: нестандартный output
Показать сообщение отдельно

Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


Насчёт получения только одной строки из ожидаемого множества. Тут уже немного зыбкая почва. Не пробовал. Точнее, не пробовал именно так. По-другому я делал. у меня тоже была проблема - приходила только одна строка, потом был длительный таймаут, потом я просил ещё рез и тут приходила куча - и задержавшиеся сообщения, и новые. Но это потому программа основывалась на 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]

Отправлено: 10:10, 10-06-2004 | #13

Название темы: нестандартный output