如何使用C API调用threadsafe rrd_update_r轮询数据库函数



谁能帮助我找出如何从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

好吧,看看源代码…

看来rrd_update_r不想看到"rrupdate"参数。因此,尝试将rrd_filevalues传递为2元素argv

实际上rrd_update的源代码并不难读;你可以在src/rrd_update.c中找到它。rrd_update_r似乎是rrd_update本身调用的一个低级得多的函数。所以这可能并不能真正解决你的潜在问题。

现在可以工作了!尼莫-谢谢你的帮助!这不完全是你的解决方案,但它是一个正确方向的暗示!

使用

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

相关内容

  • 没有找到相关文章

最新更新