谁能帮助我找出如何从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_file
和values
传递为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);