2016-09-29 4 views
3

私は2つのmsg queue [sendとreceiveのための別のキュー]を持つ2つのシングルスレッドプロセスA & Bを実装しました。プロセスAはメッセージをBに送信し、受信キューで応答を待ちます。Linuxでプロセス間通信に使用するクロックはどれですか?

私は、プロセスBは10秒後にメッセージを受信した場合B.を処理するために、プロセスAからタイムスタンプを送信したい、私はAにプロセスBからのエラー文字列を送信したい

精度にする必要がありますミリ秒。私が使用したプロセスAでは

、プロセスBでは

struct timespec msg_dispatch_time; 
    clock_gettime(CLOCK_REALTIME, &msg_dispatch_time); 
    : 
    : 
    add_timestamp_in_msg(msg, msg_dispatch_time); 
    : 
    if (msgsnd(msqid, msg, sizeof(msg), msgflg) == -1) 
     perror("msgop: msgsnd failed"); 

struct timespec msg_dispatch_time; 
    struct timespec msg_receive_time; 
    : 
    clock_gettime(CLOCK_REALTIME, &msg_received_time); 
    : 
    if(!(time_diff(msg_received_time, msg_dispatch_time) >= 10)) 
     msgsnd(msqid, &sbuf, buf_length, msg_flag) 
    else 
    { 
     /*send the error string.*/ 
     //msgsnd(msgid,) 
    } 

私の質問を比較するために、ミリ秒の精度で、ここでtime_diff関数を作成する方法)、

1であります10秒?

if(!(time_diff(msg_received_time, msg_dispatch_time) >= 10)) 



    /********Existing time diff code******************/ 
    long int time_diff (struct timeval time1, struct timeval time2) 
    { 
     struct timeval diff, 

     if (time1.tv_usec < time2.tv_usec) { 
      time1.tv_usec += 1000000; 
      time1.tv_sec--; 
     } 
     diff.tv_usec = time1.tv_usec - time2.tv_usec; 
     diff.tv_sec = time1.tv_sec - time2.tv_sec;  
     return diff.tv_sec; //return the diff in second 
    } 

2)clock_gettimeは、同じシステムでプロセス全体で使用すると問題ありませんか?あなたがstruct timespecタイプを使用して保存しておきたい場合は、その後、私はstruct timespecタイプの等価difftime()を使用することをお勧めし

+1

'enum {NS_PER_SECOND = 1000000000}; void sub_timespec(struct timespec t1、struct timespec t2、struct timespec * td) { td-> tv_nsec = t2.tv_nsec - t1.tv_nsec; td-> tv_sec = t2.tv_sec - t1.tv_sec; if(td-> tv_sec> 0 && td-> tv_nsec <0) { td-> tv_nsec + = NS_PER_SECOND; td-> tv_sec--; } else if(td-> tv_sec < 0 && td-> tv_nsec> 0) { td-> tv_nsec - = NS_PER_SECOND; td-> tv_seC++; http://www.gnu.org/software/libc/manual/html_node/Elapsed-Time.html –

+1

チェックtimeval_subtract': 'timeval_subtractは()' 'はなく構造体timeval'ためのものです'struct timespec'よりも、そうではありませんか?しかし、概念は他のタイプにも確実に適用できます。 – PnotNP

+1

@NulledPointerで }} '' –

答えて

1

、すなわち

double difftimespec(const struct timespec after, const struct timespec before) 
{ 
    return (double)(after.tv_sec - before.tv_sec) 
     + (double)(after.tv_nsec - before.tv_nsec)/1000000000.0; 
} 

しかし、私はあなたの全体的なユースケースのためのより良いオプションが存在すると思います。

プログラムが2242年まで動作することに満足している場合は、64ビット符号付き整数を使用して、エポック以降のナノ秒数を保持できます。バイナリメッセージの場合は、struct timespecよりもはるかに扱いやすいフォーマットです。基本的に:

#define _POSIX_C_SOURCE 200809L 
#include <stdint.h> 
#include <time.h> 

typedef int64_t  nstime; 
#define NSTIME_MIN INT64_MIN 
#define NSTIME_MAX INT64_MAX 

nstime nstime_realtime(void) 
{ 
    struct timespec ts; 

    if (clock_gettime(CLOCK_REALTIME, &ts)) 
     return NSTIME_MIN; 

    return ((nstime)ts.tv_sec * 1000000000) 
     + (nstime)ts.tv_nsec; 
} 

double nstime_secs(const nstime ns) 
{ 
    return (double)ns/1000000000.0; 
} 

struct timespec nstime_timespec(const nstime ns) 
{ 
    struct timespec ts; 

    if (ns < 0) { 
     ts.tv_sec = (time_t)(ns/-1000000000); 
     ts.tv_nsec = -(long)((-ns) % 1000000000); 
     if (ts.tv_nsec < 0L) { 
      ts.tv_sec--; 
      ts.tv_nsec += 1000000000L; 
     } 
    } else { 
     ts.tv_sec = (time_t)(ns/1000000000); 
     ts.tv_nsec = (long)(ns % 1000000000); 
    } 
} 

(かかわらず、バイト順序(別名エンディアン)の問題)あなたが追加することができますし、substract nstimeは、あなたが望む任意の方法にタイムスタンプを、そして彼らは、バイナリ保存に適している、あまりにも。 clock_gettime()を使用して

(上記のコードはテストされていないことに注意してください、と私はそれパブリックドメイン/ CC0を検討してください。)


は大丈夫です。 CLOCK_REALTIMECLOCK_MONOTONICの両方がシステム全体に適用されます。つまり、同じ物理的な瞬間に実行された場合、異なるプロセスでまったく同じ結果を報告する必要があります。

CLOCK_REALTIMEは、すべてのPOSIXyシステムで使用できますが、CLOCK_MONOTONICはオプションです。どちらも夏時間の変更に影響されません。増分NTP調整は、両方に影響します。管理者による手動によるシステム時間の変更は、CLOCK_REALTIMEにのみ影響します。 CLOCK_REALTIMEのエポックは現在1970年1月1日00:00:00ですが、CLOCK_MONOTONICの場合は不定です。

個人的には、clock_gettime(CLOCK_REALTIME,)を使用することをお勧めします。これは、アプリケーションがローカルマシンだけでなくクラスタ内のプロセス間で会話できるためです。クラスタノードはCLOCK_MONOTONICの異なるエポックを使用することがあります。

関連する問題