2011-07-13 1 views
1

rrdtool c APIのrrd_update_r関数をhttp://oss.oetiker.ch/rrdtool/index.en.htmlから呼び出す方法を知ってもらえますか?threadsafe rrd_update_rを呼び出す方法C APIを使用したRound Robinデータベース関数ですか?

...

通常rrd_update rrd_updateの非スレッドセーフバージョンを呼び出すことは非常に簡単でしたが、この1つは、よりトリッキーです:プログラムの開発は、マルチスレッドで実行する必要があるため

char *updateparams[] = { 
     "rrdupdate", 
     rrd_file, 
     values, 
     NULL 
    }; 

    rrd_clear_error(); 
    result = rrd_update(3, updateparams); //argc is first arg 

環境私はthreadsafe関数を使用しないことでいくつかのエラーが発生しました! しかし、それはあまりにもテンプレートを必要とするため、...、

int rrd_update_r(const char *filename, const char *_template, 
      int argc, const char **argv); 

rrd_update_rを使用するのは容易ではないと私は実際に動作しませんどのように作成する...

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

私はあなたがhttp://oss.oetiker.ch/rrdtool/prog/rrdthreads.en.htmlを見ていたと思いますか?残念ながら、 'rrd_update_r'は言及していません。 – evnu

+0

はい私はrrdthreads.en.htmlを見ましたが、rrd_update_rは参考実装として( "例としてrrd_update_rを参照してください)参照してください。 – roegi

答えて

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); 
+0

この例のqueue_thread_main関数は、rrd_update_r http://oss.oetiker.ch/rrdtool-trac/browser/trunk/program/src/rrd_daemon.cを使用しています。 – roegi

1

まあ、...

rrd_update_r"rrupdate"引数を見たいと思っていないように見えます。したがって、rrd_filevaluesを2要素のargvとして渡すだけです。

実際にはrrd_updateのソースは読みにくくありません。 src/rrd_update.cで見つけることができます。 rrd_update_rは、rrd_update自身が呼び出すはるかに低レベルの機能のようです。したがって、これは実際にあなたの根本的な問題を解決することはできません。

+0

したがって、char * updateparams [] = { rrd_file、 の値、 NULL }を使用するだけです。第4引数として ? さらに、2番目の引数としてテンプレートが必要になるようですが、どうすればよいのか、作成方法はわかりません。 rrdtoolのWebサイトでは、_r関数はスレッドセーフなものであり、 rrd_updateは既にスレッドセーフな方法でrrd_update_rに実装されています。うまくいけばそれは本当に完了しました... – roegi

+1

@roegi:私が知る限り、 'template'パラメータはNULLにすることができます。 (実際には、これは、 'rrd_update'が' rrd_update_r'を呼び出す方法です。argvに '--template'引数がない場合) – Nemo

+0

okは素晴らしいです!明日の朝にrrd_update_r(rrd_file、NULL、2、updateparams)を使って再度実行しようとします。とchar * updateparams [] = {rrd_file、values、NULL}; 私は、同じエラー(「rrdupdateからのデータソースには見つからない予定のタイムスタンプ」)が発生すると思いますが、うまくいけばあなたは正しいと思います! – roegi