fgets читает строки ** после ** программа, выполненная с окончанием popen - PullRequest
0 голосов
/ 02 октября 2018

Программа sdh :

#include <stdlib.h>
#include <stdio.h>
#include <string.h>


void main(void) {
    FILE *fp = popen("/path/to/asd", "r");
    char str[256];
    while (fgets(str, sizeof(str), fp) != NULL) {
        printf("%s", str);
    }
}

Программа asd :

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>

void main(void) {
    printf("A\n\r");
    sleep(1);
    printf("B\n\r");
}

При запуске программы sdh ,он ждет 1 секунду, а затем печатает

A
B

Я хотел бы напечатать

A

, подождать 1 секунду, а затем вывести

B

Другими словами, программа asd завершает работу до того, как fgets удастся прочитать первую строку.Как мне изменить это, чтобы иметь возможность читать строки, как только они напечатаны?

1 Ответ

0 голосов
/ 02 октября 2018

Стандартный выходной поток (stdout) по умолчанию буферизуется и сбрасывается при заполнении буфера.Наличие новой строки в printf немедленно сбрасывается, только если вывод идет на консоль / терминал.Но в вашем случае он идет в канал, поэтому он не сбрасывается.

Добавление fflush(stdout); после того, как каждый оператор printf (в программе "asd") даст желаемоеповедение, т. е. немедленно очищать вывод из буферов stdio.

Но если вы не хотите буферизовать stdio, вы можете отключить его вместе с setbuf(3).Например, добавьте setbuf(stdout, NULL); в начале программы "asd".

В качестве альтернативы вы также можете использовать системный вызов write(2), который вообще не буферизуется, если вы 'в системе Unixy.

...