2016-06-19 10 views
1

私はDebianユーザー空間でアプリケーションを実行していますが、私はログにrsyslogを使用しています。 Iは、次のコマンドを使用して、メインスレッドにログを開く:この後rsyslogが同じログを2回出力する

openlog(NULL, LOG_CONS | LOG_NDELAY, LOG_LOCAL0); 

メインスレッドは、2つのスレッド(デタッチ)作成:

pthread_create(&tx_tid, NULL,tx_main, NULL); 
if(0 != th_ret_val) 
{ 
    LOG(LEVEL_ERR,"failed to create tx thread, ret_val = %d",th_ret_val); 
} 
pthread_detach(tx_tid); 

pthread_create(&rx_tid, NULL,rx_main, NULL); 
if(0 != th_ret_val) 
{ 
    LOG(LEVEL_ERR,"failed to create rx thread, ret_val = %d",th_ret_val); 
} 
pthread_detach(rx_tid); 

およびpthread_exitを行います。

ログの中には、いくつかのログが2回印刷されているのがわかります(これはLOG上に増えたトークン番号を追加して同じトークン番号を印刷したため同じLOGです)行方不明!

なぜこのようなことが起こるのかを教えてもらえますか?

注:

#define LOG(prio, ...) my_log(__FILE__, __LINE__, __func__, prio, __VA_ARGS__) 

と次のようにmy_logが実装されている: LOGマクロがある

#define LOG_MAX_LEN 200 
[LOG_MAX_LEN] full_fmt

静的チャー。

void my_log(const char * file、int line、const char * func、int prio、const char * fmt、...) { va_list args;

snprintf(full_fmt, LOG_MAX_LEN, "LOG:tid-%d %-30s:%003d, %-20s - %s", pthread_self(), file, line, func, fmt); 
va_start(args, full_fmt); 
vsyslog(prio, full_fmt, args); 
//vprintf(full_fmt, args); 
va_end(args); 

}

答えて

0

iが問題の原因を見出しました。私はミューテックスでmy_logを保護しなかったし、syslogに送られるメッセージはグローバル文字列full_fmtです。 ミューテックスを追加するとこの問題が解決しました。

関連する問題