如何用C API调用threadsafe rrd_update_r循环数据库函数?

时间:2011-07-13 15:07:19

标签: c thread-safety rrdtool rrd

有人可以帮我找到如何从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, roegi

2 个答案:

答案 0 :(得分:1)

好吧,看看源代码......

rrd_update_r似乎不希望看到"rrupdate"参数。因此,请尝试将rrd_filevalues作为2元素argv传递。

实际上rrd_update的来源并不难读;你可以在src / rrd_update.c中找到它。并且rrd_update_r似乎是rrd_update本身所称的更低级别的功能。因此,这可能无法解决您的潜在问题。

答案 1 :(得分:0)

现在它正在运作! Nemo - thx求助! 这不是你的解决方案,但这是对正确方向的暗示!

适用于:

/*
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);