Очередь сообщений не будет читать сообщения перечислимого типа

Я пытаюсь использовать очередь сообщений для отправки и получения сообщений между процессами отца и сына. Я использовал enum для установки типов сообщений для msgrcv, но, похоже, эта информация игнорируется:

enum children {
  e_father_child1 = 1,
  e_father_child2 = 2,
  e_child1_father = 10,
  e_child2_father = 20
}; 

и команда это:

queue_indc = msgrcv (msgid, &msg, sizeof (msg.m_data), e_child1_father, 0);

Это работает, если я изменяю аргумент с типа enum на int, но мне было интересно, почему он не работает как enum и есть ли другой способ заставить его работать.

Заранее спасибо!

1 ответ

Кажется, что msgtyp обрабатывается как long, а не как обычный int. И перечисления рассматриваются как обычные целые числа.

ssize_t msgrcv (int msqid, void * msgp, size_t msgsz, long msgtyp, int msgflg);

Так что я думаю, что у компилятора возникают проблемы с преобразованием enum в long, где преобразование int в long может быть сделано проще. Что делать, если вы пытаетесь навести msgtyp на long? Когда я скомпилировал приведенный выше код, он работал без каких-либо преобразований.

например

queue_indc = msgrcv (msgid, &msg, sizeof (msg.m_data), (long) e_child1_father, 0);

Вот статья, которая может помочь объяснить тип перечисления:

http://www.embedded.com/electronics-blogs/programming-pointers/4026892/Enumerations-are-integers-except-when-they-re-not

Другие вопросы по тегам