26.5.5. Проверка наличия сообщения в очереди

26.5.5. Проверка наличия сообщения в очереди

Наверное, вы не хотите, чтобы ваша программа ждала, пока в очереди появится нужное сообщение. Используя особенности системного вызова msgrcv(), можно написать код проверки наличия сообщения определенного типа в очереди. Напишем функцию msg_exists(), которая будет возвращать TRUE, если сообщение есть в очереди, или FALSE, если сообщения в очереди нет.

int msg_exists(int id, long type) {

 int res;

 if ((result = msgrcv(id, NULL, 0, type, IPC_NOWAIT)) == -1) {

  if (errno == E2BIG)

   return(TRUE);

 }

 return(FALSE);

}

В вызове msgrcv() отсутствует адрес буфера и длина сообщения. Этим мы специально провоцируем ошибку, а вызов IPC_NOWAIT отказывает от блокировки процесса. Мы проверяем errno; если он равен E2BIG, значит, сообщение есть в очереди. Ошибка E2BIG порождается потому, что мы установили размер сообщения равным 0.

Данный текст является ознакомительным фрагментом.