fgets在执行popen完成的程序后**读取行

时间:2018-10-02 08:36:20

标签: c popen

程序 sdh

FileSystem

程序 asd

#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);
    }
}

运行程序 sdh 时,它将等待1秒钟,然后打印

#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");
}

我想做的是打印

A
B

,等待1秒钟,然后打印

A

换句话说,程序{em> asd 在B 设法读取第一行之前完成。我应该如何修改它以便能够在打印行后立即读取?

1 个答案:

答案 0 :(得分:1)

默认情况下缓冲标准输出流(stdout),只要缓冲区已满,就会刷新该输出。在printf中使用换行符会立即刷新 仅当输出将发送到控制台/终端时。但是,在您的情况下,它将进入管道,因此不会被冲洗。

在每个printf语句之后(在“ asd”程序中)添加fflush(stdout);会产生所需的行为,即立即清除stdio缓冲区的输出。

但是,如果您不想使用stdio缓冲,则可以将其与setbuf(3)一起完全禁用。例如,在“ asd”程序的开头添加setbuf(stdout, NULL);

或者,如果您使用的是unixy系统,也可以使用write(2)系统调用,该调用根本不会缓冲。