程序 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
设法读取第一行之前完成。我应该如何修改它以便能够在打印行后立即读取?
答案 0 :(得分:1)
默认情况下缓冲标准输出流(stdout),只要缓冲区已满,就会刷新该输出。在printf中使用换行符会立即刷新 仅当输出将发送到控制台/终端时。但是,在您的情况下,它将进入管道,因此不会被冲洗。
在每个printf语句之后(在“ asd”程序中)添加fflush(stdout);
会产生所需的行为,即立即清除stdio缓冲区的输出。
但是,如果您不想使用stdio缓冲,则可以将其与setbuf(3)
一起完全禁用。例如,在“ asd”程序的开头添加setbuf(stdout, NULL);
。
或者,如果您使用的是unixy系统,也可以使用write(2)
系统调用,该调用根本不会缓冲。