1

http://oss.oetiker.ch/rrdtool/index.en.htmlから rrdtool c API の rrd_update_r 関数を呼び出す方法を見つけるのを手伝ってくれる人はいますか?

非スレッドセーフ バージョンの rrd_update を呼び出すのは非常に簡単でしたが、これはよりトリッキーです...

通常のrrd_update:

  char *updateparams[] = {
        "rrdupdate",
        rrd_file,
        values,
        NULL
    };

    rrd_clear_error();
    result = rrd_update(3, updateparams); //argc is first arg

プログラムはマルチスレッド環境で実行する必要があるため、スレッドセーフ関数を使用しないことでいくつかのエラーが発生しました! しかし、テンプレートも必要なので、rrd_update_r を使うのは簡単ではありません...

 int    rrd_update_r(const char *filename, const char *_template,
            int argc, const char **argv);

そして、私はそれを作成する方法が本当にわかりません...

    char *updateparams[] = {
        "rrdupdate",
        rrd_file,
        values,
        NULL
    };


    rrd_clear_error();
   result = rrd_update_r(rrd_file, NULL,3, updateparams);

動作せず、実行時に次のエラーが発生します...

error: /var/tmp/rrds/1.rrd: expected timestamp not found in data source from rrdupdate

うまくいけば、誰かが私を助けることができます!

thx と br、ろえぎ

4

2 に答える 2

1

さて、ソースコードを見てみると…

は引数rrd_update_rを見たくないようです。したがって、 andを 2 要素として"rrupdate"渡してみてください。rrd_filevaluesargv

実際、のソースrrd_updateは読みにくいものではありません。src/rrd_update.c で見つけることができます。そして、それ自体が呼び出すrrd_update_rはるかに低レベルの関数のようです。rrd_updateしたがって、これは実際には根本的な問題を解決しない場合があります。

于 2011-07-13T17:11:04.853 に答える
0

今、それは働いています!ニモ - 助けてくれてありがとう!それはまさにあなたの解決策ではありませんでしたが、正しい方向へのヒントでした!

以下で動作します:

/*
rrd_file is a char * to "/var/tmp/1.rrd"
NULL says not to use a template
1 --> argc 
values is a char * to "N:value-1:value-2:.....:value-n"
*/

result = rrd_update_r(rrd_file, NULL, 1, (void *) &values); 
于 2011-07-14T08:20:58.497 に答える