【发布时间】:2025-12-29 10:15:09
【问题描述】:
我已经实现了两个单线程进程 A 和 B,带有两个 msg 队列 [用于发送和接收的单独队列]。进程 A 将向 B 发送消息,并在接收队列中等待回复。
我想从进程 A 向进程 B 发送一个时间戳。如果进程 B 在 10 秒后收到消息,我想从进程 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; 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++; } } -
在gnu.org/software/libc/manual/html_node/Elapsed-Time.html中检查
timeval_subtract -
@NulledPointer:
timeval_subtract()是为struct timeval而不是struct timespec,不是吗?但这些概念当然可以应用于其他类型。