簡體   English   中英

通過fork和pipe調用gnuplot並更新圖

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM