有人可以帮我找到如何从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
答案 0 :(得分:1)
好吧,看看源代码......
rrd_update_r
似乎不希望看到"rrupdate"
参数。因此,请尝试将rrd_file
和values
作为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);