[решено] Как читать из трубы на ходу? (fgets и getline срабатывают только в конце)

Модератор: Модераторы разделов

dergachev
Сообщения: 847
ОС: archlinux

[решено] Как читать из трубы на ходу?

Сообщение dergachev »

Подскажите, пожалуйста. Вот у меня программа, скажем, по имени "A" - на Сях, примерно такого вида:

Код: Выделить всё

    printf("Starting loop\n");
    while ((read = getline(&str,&len,stdin)) != -1) {
        printf("Checkpoint\n");
        /* здесь еще куча всего */
    }
А программа "B" сыпет строчки в stdout, и я их вместе вызываю командой Результат: Как только программа B завершается, программа A начинает обрабатывать (появляется первая строчка "Checkpoint").
Желаемый результат: Чтобы как только B что-нибудь напечатала - сразу A это обработала.
Как для этого надо организовать цикл?
P.S. Пробовал через fgets - то же самое. scanf("%s",...) не подходит, так как нужна строчка, а не слово.
P.P.S. Попробовал глянуть в исходники команды cat - о_О, многа букав, ниасилил :)
Спасибо сказали:
Аватара пользователя
anonymous.ru
Сообщения: 614

Re: [решено] Как читать из трубы на ходу?

Сообщение anonymous.ru »

читай с помощью read(2) :P
:drinks:
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: [решено] Как читать из трубы на ходу?

Сообщение NickLion »

Ну, если уж на то пошло, scanf можно приспособить:
scanf("%[^\n]\n",...)
А вот поможет ли это - вопрос другой :)
Программа A отрабатывает сразу, не ждёт окончания программы B даже в указанном Вами случае. Просто тут даёт эффект буферирование. Запустите "find / | A" - увидите Checkpoint до окончания работы find. Ну, а без буфера - да, наверное, read лучше всего будет. Ниже только системные буферы.
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: [решено] Как читать из трубы на ходу?

Сообщение eddy »

setbuf(..., NULL)

P.S. Кстати, я одно время делал отсылку информационных сообщений от сервера клиенту через трубу, из которой периодически считывались данные. Проблема была в том, что в промежутки между запуском считывающего процесса, ясное дело, данные "улетали в трубу" :) Поэтому теперь использую очереди сообщений.
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
dergachev
Сообщения: 847
ОС: archlinux

Re: [решено] Как читать из трубы на ходу?

Сообщение dergachev »

Короче, я пока что счастлив. То есть я ничего не понял, но работает. Во-первых, перешел на read(0,...), во-вторых, в программе "B" всюду понапихал fflush(stdout).

Без последнего действия счастья не было, без перехода на read() - не знаю. Не понимаю, почему если запустить "B" без трубы, то всё само сыпется, а с трубой надо flush'ить. :blush:
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: [решено] Как читать из трубы на ходу?

Сообщение eddy »

dergachev писал(а):
09.06.2010 00:19
понапихал fflush(stdout).

Сделайте один раз setbuf( ..., NULL) - и не надо будет сбрасывать буферы постоянно :)
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: [решено] Как читать из трубы на ходу?

Сообщение drBatty »

dergachev писал(а):
09.06.2010 00:19
понапихал fflush(stdout).

Без последнего действия счастья не было

ну ещё-бы - fputc пишет символ в память, а в трубу символы попадают либо если память заполнится, либо если явно написать fflush, либо если программа завершится. Вы можете писать по 100Гб, и тоже будет счастье (:
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: