我已經實現了兩個單線程進程A & B,帶有兩個msg隊列[獨立的發送和接收隊列]。進程A將向B發送消息並等待接收隊列中的回覆。哪個時鐘應該用於linux中的進程間通信?
我想從進程A發送時間戳如果過程B之後10秒接收消息處理B.,我想從處理B發送一個錯誤串A.
精度應該在毫秒。
在方法A,我用,
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");
在方法B,
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,)
}
我的問題是,
1)如何在這裏寫一個time_diff功能與毫秒級精確度比較對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可以在同一個系統的進程中使用嗎?
'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; (td-> tv_sec> 0 && td-> tv_nsec <0) td-> tv_nsec + = NS_PER_SECOND; td-> tv_sec--; (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檢查'timeval_subtract' – PnotNP
@NulledPointer:'timeval_subtract()'用於'struct timeval'而非比'struct timespec',不是嗎?但這些概念當然可以應用於其他類型。 –