Pierwszą strukturą, której się przyjrzymy jest msgbuf. Ta struktura może być postrzegana jako szablon dla wiadomości. Sprawą programisty jest zdefiniowanie struktury tego typu, jest ważne abyś zrozumiał, iż istnieje struktura typu msgbuf. Jest ona zadeklorowana w linux/msg.h następująco:
/* buffor wiadomości dla wywołań msgsnd i msgrcv */
struct msgbuf {
long mtype; /* typ wiadomości */
char mtext[1]; /* tekst wiadomości */
};
Struktura msgbuf ma dwóch członków:
Typ wiadomości reprezentowany jako liczba dodatnia. To musi być liczba dodatnia!
Wiadomość.
Możliwość nadawania określonej wiadomości typu dostarcza ci narzędzia do tworzenia różnorodnych wiadomości w jednej kolejce. Dla przykładu: procesy typu klient mogą rozpoznawać specjalny numer oznaczający wiadomość od serwera, a serwer będzie obsługiwał inny numer oznaczający, że jest to wiadomość od klienta. Inny scenariusz: aplikacja może znakować wiadomości o błędach jedynką, żądania dwójką, masz nieograniczone możliwości.
Nie daj się zwieść przez nazwę drugiego elementu - mtext. Pole to nie jest zmuszone do przechowywania tablicy znaków, możesz przesyłać cokolwiek. Samo to pole może zniknąć z wiadomości, gdyż cała struktura może zostać przedefiniowana przez programistę. Rozważ taką możliwość:
struct moj_msgbuf {
long mtype; /* Typ wiadomości */
long id_zadania; /* Identyfikator żądania */
struct klient_info; /* Stuktura informacji dla klienta */
};
Powyżej widzimy strukturę wiadomości, jednakże jest ona nieco zmieniona - jeden z jej elemntów został usunięty, a na jego miejse pojawiły się dwa nowe, z których jeden jest strukturą! Oto jest piękno kolejek wiadomości! Jądro w żaden sposób nie przetwarza przesyłanych danych. Możesz przesyłać każdą informację.
Niestety istnieje pewien wewnętrzny limit - maksymalny rozmiar wiadomości zdefiniowany jest w linux/msg.h następująco:
#define MSGMAX 4056 /* <= 4056 */ /* maxymalny rozmiar wiadomości ( bajty ) */
Całkowita wiadomość nie może być większa niż 4056 bajtów, włączając w to mtype, który ma 4 bajty długości (long).