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 and br, roegi

4

2 回答 2

1

好吧,看看源代码...

看来是rrd_update_r不想看到"rrupdate"说法了。因此,请尝试将rrd_fileandvalues作为 2-element传递argv

其实源代码rrd_update并不难读;你可以在 src/rrd_update.c 中找到它。并且似乎是一个本身调用rrd_update_r的低级函数。rrd_update因此,这实际上可能无法解决您的潜在问题。

于 2011-07-13T17:11:04.853 回答
0

现在它正在工作!Nemo - 感谢您的帮助!这不完全是您的解决方案,但它暗示了正确的方向!

它适用于:

/*
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 回答