[英]call gnuplot via fork and pipe and update plot
我想在模擬過程中進行一些實時繪圖。 為此,我想使用八度或gnuplot。 我當前的方法是使用前端來gnuplot,feedgnuplot,這實際上非常合適。
模擬是用C ++編寫的,因此我考慮了分叉(feedgnuplot的新過程)並將相關數據傳遞給feedgnuplot。
我的問題是輸出僅在仿真后可見。 但是我想看看模擬過程中的情節更新。
這是MWE:
#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>
int main()
{
FILE* stream = popen("feedgnuplot", "w");
for(int i = 0; i < 10; ++i)
{
fprintf(stream, "%d\n", i * i);
fflush(stream);
sleep(1);
}
}
程序在10秒后停止,顯示該圖。
直接在外殼中使用feedgnuplot
,一切都會按預期進行。 (也就是說,無需結束過程即可繪制新添加的數據)
我究竟做錯了什么? 我認為我對Popen的工作原理缺乏了解。
首先,讓我們編寫一個假的feedgnuplot.c:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *buf = NULL;
size_t n = 0;
while (getline (&buf, &n, stdin) != -1) {
printf ("%s", buf);
}
free (buf);
return 0;
}
這樣,您的代碼就可以工作,即行到達時將其打印出來。
我懷疑問題出在您的feedgnuplot程序讀取傳入數據的方式上。 您應該顯示該代碼的相關部分。
如果我不得不猜測,您可能需要添加
setvbuf (stdin, NULL, _IOLBF, 0);
在您開始從stdin讀取之前,在feedgnuplot中。
這是因為默認情況下,當stdin對應於終端時,它被行緩沖,而當它對應於管道時,它被完全緩沖。 上面的代碼無論如何都會使stdin行緩沖,因此從終端或管道讀取之間應該沒有區別。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.