Реализация таймера WatchDog
Мне нужно реализовать таймер, который проверяет условия каждые 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 ответ
Вы можете попробовать msgctl(msqid, IPC_STAT, struct msqid_ds *msgqdsbuf);
Если вызов успешен, то текущее количество сообщений можно найти с помощью msgdsbuf->msg_qnum
, Звонившему потребовались разрешения на чтение, которые, я думаю, у вас могут быть здесь.