实现WatchDog计时器

时间:2016-03-17 00:01:29

标签: c timer watchdog msgrcv

我需要实现一个每35秒检查一次条件的计时器。我的程序使用IPC方案在客户端和服务器进程之间来回传递信息。问题是我在循环中运行msgrcv()函数,它暂停循环直到找到消息,这是不好的,因为我需要定时器始终检查客户端是否已停止发送消息。 (如果只检查收到消息的时间,这将是无用的......)

这个问题可能看起来不太清楚,但我需要的基础知识是一种实现看门狗定时器的方法,该定时器每隔35秒检查一次条件。

我目前有这段代码:

time_t start = time(NULL);

//Enter main processing loop
while(running)
{
    size_t size = sizeof(StatusMessage) - sizeof(long);

    if(msgrcv(messageID, &statusMessage, size, 0, 0) != -1)
    {
        printf("(SERVER) Message Data (ID #%ld)  =  %d  :  %s\n", statusMessage.machineID, statusMessage.status_code, statusMessage.status);

        masterList->msgQueueID = messageID;
        int numDCs = ++masterList->numberOfDCs;

        masterList->dc[numDCs].dcProcessID = (pid_t) statusMessage.machineID;
        masterList->dc[numDCs].lastTimeHeardFrom = 1000;

        printf("%d\n", masterList->numberOfDCs);
    }

    printf("%.2f\n", (double) (time(NULL) - start));
}

唯一的问题就是我之前说过的,检查已经过了多少时间的代码,如果没有消息进入就不会达到,因为msgrcv函数将保持进程。

我希望我有意义,并且有人能够帮助解决我的问题。

1 个答案:

答案 0 :(得分:1)

您可能想尝试msgctl(msqid, IPC_STAT, struct msqid_ds *msgqdsbuf);如果通话成功,则可以使用msgdsbuf->msg_qnum找到当前的消息数。调用者需要读权限,我想你可能会在这里。