Очередь сообщений. msgsend msgrcv. Системные вызовы System V IPC в C (Linux)

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

/* struct that defines a message */
struct msgbuf{
  long mtype;         /* must be positive */
  int childId;        //ID of child sending message
  int bufferChanged;  //Buffer at which value was changed
  int beforeValue;    //Value before child sleeps
  int afterValue;     //Value after child sleeps
};

Поэтому при чтении, записи и проверке изменений процессы сохраняют сообщения следующим образом

struct msgbuf msg = {BUFFER_CHANGED, id, position, read, bufferArr[position]};
if(msgsnd(msqid, &msg, sizeof(msg), 0)== -1){
  perror("msgsnd in read.write");
}

Это работает нормально. Да, кстати, вот как я создаю очередь сообщений.

#define BUFFER_CHANGED 1

qKey = ftok("./", 'A');

msqid = msgget(qKey, (IPC_CREAT | 0666));

/*Perform the following if the call is unsuccessful.*/
if(msqid == -1){
  printf ("\nThe msgget call failed, error number = %d\n", errno);
}
/*Return the msqid upon successful completion.*/
else{
  printf ("\nMessage queue successful. The msqid = %d\n", msqid);
  //exit(0);
}

Поэтому моя проблема в том, что я не совсем уверен, как извлечь сообщения из очереди и отобразить их на экране. Я читал на msgrcv() системный вызов, но мне это не очень понятно.

rc = msgrcv(msqid, &msg, sizeof(msg), BUFFER_CHANGED, IPC_NOWAIT);

rc является int поскольку msgrcv() возвращает int, Как я могу указать это int к фактическому сообщению? Как прочитать содержимое сообщения, чтобы отобразить его? Я предполагаю, что это должно быть сделано в каком-то цикле.

2 ответа

rc = msgrcv(msqid, &msg, sizeof(msg), BUFFER_CHANGED, IPC_NOWAIT)

msg содержит данные, которые вы хотите отобразить на экране. Поскольку используется IPC_NOWAIT, функция немедленно возвращается без блокировки. Значение rc будет равно -1, если не было прочитано ни одного сообщения, иначе это будет количество байтов, прочитанных из сообщения.

Возвращаемое значение int потому что он говорит вам, сколько данных он прочитал в ваш буфер сообщений - в вашем случае вы хотите увидеть 4 * sizeof(int) вернись за полным сообщением. Если rc возвращается как -1, у вас есть ошибка. Если rc вернулся как положительное число, по крайней мере, некоторые из полей msg будет иметь полученные данные сообщения.

Проверьте man-страницу для более подробной информации.

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