Очередь сообщений. 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-страницу для более подробной информации.