msgop

Autres langues

Langue: pl

Autres versions - même langue

Version: 2002-06-01 (openSuse - 09/10/07)

Section: 2 (Appels système)

NAZWA

msgop - przekazywanie komunikatów

SK£ADNIA


#include <sys/types.h>


#include <sys/ipc.h>
#include <sys/msg.h>

int msgsnd(int msqid, struct msgbuf *msgp, size_t msgsz, int msgflg);

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

OPIS

W celu wys³ania lub odebrania komunikatu, proces powinien zaalokowaæ strukturê danych o nastêpuj±cej postaci ogólnej:

       struct msgbuf {
               long    mtype;   /* rodzaj komunikatu, musi byæ > 0 */

               char    mtext[1];        /* przekazywane dane */

       };

Pole
mtext jest tablic± (lub inna struktur±) o rozmiarze okre¶lonym przez msgsz, bêd±cym nieujemn± liczb± ca³kowit±. Dozwolone s± komunikaty o zerowej d³ugo¶ci (tzn. nie zawieraj±ce pola mtext) Warto¶æ pola mtype musi byæ liczb± ¶ci¶le dodatni±, która mo¿e s³u¿yæ procesowi odbieraj±cemu komunikaty do filtrowania kolejki. (zobacz czê¶æ dotycz±c± msgrcv).

Proces wywo³uj±cy funkcjê musi mieæ prawo zapisu do kolejki, aby wys³aæ komunikat, natomiast prawo odczytu jest niezbêdne, aby komunikat odebraæ.

Wywo³anie systemowe msgsnd do³±cza kopiê komunikatu wskazywanego przez msgp do kolejki o identyfikatorze okre¶lonym przez msqid.

Gdy w kolejce jest do¶æ miejsca, msgsnd koñczy siê pomy¶lnie natychmiast (Pojemno¶æ kolejki okre¶lona jest w polu msg_bytes struktury danych stowarzyszonej z kolejk±. Podczas tworzenia kolejki nadawana jest mu warto¶æ inicjalna wynosz±ca MSGMNB bajtów, lecz ograniczenie to mo¿e zostaæ zmienione za pomoc± msgctl.) Gdy w kolejce nie ma do¶æ miejsca, to domy¶lne zachowanie msgsnd polega na wstrzymaniu wykonywania funkcji do czasu, gdy miejsce stanie siê dostêpne. If Ustawienie w msgflg znacznika IPC_NOWAIT spowoduje, ¿e zamiast tego wywo³anie systemowe zakoñczy siê niepomy¶lnie, zg³aszaj±c b³±d EAGAIN.

Wstrzymane wywo³anie msgsnd mo¿e równie¿ zakoñczyæ siê niepomy¶lnie, gdy kolejka zostanie usuniêta (i wtedy wywo³anie to powoduje przypisanie zmiennej errno warto¶ci EIDRM), lub gdy zostanie przechwycony sygna³ (i wtedy wywo³anie to powoduje przypisanie zmiennej errno warto¶ci EINTR). (msgsnd i msgrcv po przerwaniu przez obs³ugê sygna³u nie s± nigdy automatycznie restartowane, nie zale¿nie od ustawienia znacznika SA_RESTART podczas ustanaiwiania funkcji obs³ugi sygna³u.)

W wyniku pomy¶lnego wykonania operacji, struktura danych opisuj±ca kolejkê komunikatów zostanie zmodyfikowana nastêpuj±co:

msg_lspid przypisany zostanie identyfikator procesu wykonuj±cego tê operacjê.
msg_qnum zostanie zwiêkszone o 1
msg_stime zostanie przypisany aktualny czas.

Wywo³anie systemowe msgrcv odczyta komunikat z kolejki wskazanej przez parametr msqid do struktury msgbuf wskazywanej przez parametr msgp usuwaj±c odczytany komunikat z kolejki.

Parametr msgsz okre¶la maksymalny rozmiar (w bajtach) pola mtext struktury wskazywanej przez parametr msgp. Je¶li dane komunikatu zajmuj± wiêcej bajtów, ni¿ msgsz, a parametr msgflg zawiera znacznik MSG_NOERROR, wówczas dane komunikatu zostan± obciête (obciêta czê¶æ zostanie utracona). Je¶li znacznik nie jest ustawiony a (a komunikat jest za d³ugi), wówczas nie zostanie on usuniêty z kolejki, natomiast system zg³osi b³±d a zmiennej errno zostanie przypisana warto¶æ E2BIG.

Parametr msgtyp okre¶la rodzaj komunikatu w nastêpuj±cy sposób:

Je¶li msgtyp jest równy 0, to czytany jest pierwszy dostêpny komunikat w kolejce (czyli najdawniej wys³any).
Je¶li msgtyp ma warto¶æ wiêksz± ni¿ 0, to z kolejki odczytywany jest pierwszy komunikat tego typu, chyba ¿e w parametrze msgflg zostanie ustawiony znacznik MSG_EXCEPT, kiedy to z kolejki zostanie odczytany pierwszy komunikat o typie innym ni¿ podany w msgtyp.
Je¶li msgtyp ma warto¶æ mniejsz± ni¿ 0, to z kolejki zostanie odczytany pierwszy komunikat o najni¿szym numerze typu, o ile jest on mniejszy lub równy warto¶ci bezwzglêdnej msgtyp .

Parametr msgflg zawiera bitow± alternatywê (OR) ¿adnego, jednego lub wiêcej spo¶ród nastêpuj±cych znaczników:

IPC_NOWAIT Wywo³anie nie bêdzie wstrzymywaæ pracy procesu, je¶li w kolejce nie ma komunikatów odpowiedniego typu. Wywo³anie systemowe zg³osi wówczas b³±d, przypisuj±c zmiennej errno warto¶æ ENOMSG.
MSG_EXCEPT U¿ywane jest wtedy, gdy msgtyp ma warto¶æ wiêksz± ni¿ 0, spowoduje odczytanie z kolejki pierwszego komunikatu innego typu, ni¿ msgtyp.
MSG_NOERROR Spowoduje obciêcie komunikatu, je¶li jego dane s± d³u¿sze ni¿ msgsz bajtów.

Je¶li w kolejce nie ma komunikatu spe³niaj±cego te warunki, za¶ znacznik IPC_NOWAIT nie zosta³ przekazany w msgflg, to proces zostanie wstrzymany, dopóki nie nast±pi jedno z poni¿szych zdarzeñ:

Komunikat odpowiedniego typu zostanie umieszczony w kolejce.
Kolejka zostanie usuniêta z systemu. W tym przypadku wywo³anie systemowe zg³osi b³±d, przypisuj±c zmiennej errno warto¶æ EIDRM.
Proces wywo³uj±cy otrzyma sygna³ wymagaj±cy przechwycenia. W tym przypadku wywo³anie systemowe zg³osi b³±d, przypisuj±c zmiennej errno warto¶æ EINTR.

Je¶li operacja zakoñczy siê pomy¶lnie, to struktura danych opisuj±ca kolejkê zostanie nastêpuj±co zmodyfikowana:

msg_lrpid przyjmie warto¶æ równ± identyfikatorowi wo³aj±cego procesu
msg_qnum zostanie zmniejszone o 1.
msg_rtime zostanie przypisany aktualny czas.

WARTO¦Æ ZWRACANA

W przypadku niepowodzenia, obydwa wywo³ania zwróc± -1 i przypisz± zmiennej errno warto¶æ okre¶laj±c± rodzaj b³êdu. W przeciwnym przypadku, msgsnd zwróci 0, za¶ msgrvc zwróci liczbê bajtów skopiowanych z kolejki do tablicy mtext.

B£ÊDY

Je¶li wywo³anie msgsnd nie powiedzie siê, to zmienna errno przyjmie jedn± z poni¿szych warto¶ci:
EAGAIN
Komunikat nie mo¿e zostaæ wys³any do kolejki, z powodu ograniczenia msg_qbytes, a znacznik IPC_NOWAIT zosta³ przekazany w parametrze mgsflg.
EACCES
Proces nie ma prawa zapisu do kolejki komunikatów.
EFAULT
dres wskazywany przez msgp jest niedostêpny.
EIDRM
Kolejka zosta³a w miêdzyczasie usuniêta.
EINTR
Podczas oczekiwania na zwolnienie miejsca w kolejce, proces przechwyci³ sygna³.
EINVAL
Niew³a¶ciwa warto¶æ msqid, mtype (powinna byæ dodatnia) lub msgsz (powinna byæ wiêksza lub równa 0 i mniejsza lub równa MSGMAX).
ENOMEM
Brak w systemie pamiêci na skopiowanie podanego msgbuf.

Je¶li wywo³anie msgrcv nie powiedzie siê, to zmiennej errno zostanie przypisana jedna z poni¿szych warto¶ci:

E2BIG
Tekst komunikatu jest d³u¿szy ni¿ msgsz , za¶ znacznik MSG_NOERROR nie zosta³ w parametrze msgflg ustawiony.
EACCES
Proces nie ma prawa do odczytu danej kolejki komunikatów.
EFAULT
Adres wskazywany przez msgp jest niedostêpny.
EIDRM
Proces oczekiwa³ na komunikat, ale w miêdzyczasie kolejka zosta³a usuniêta.
EINTR
Proces oczekiwa³ na komunikat, ale dotar³ do niego jaki¶ wymagaj±cy obs³u¿enia sygna³.
EINVAL
Niew³a¶ciwa warto¶æ msgqid lub msgsz (powinna byæ wiêksza lub równa 0).
ENOMSG
Znacznik IPC_NOWAIT zosta³ przekazany w msgflg , ale w kolejce nie ma komunikatu ¿±danego typu.

UWAGI

Wywo³anie msgsnd obowi±zuj± nastêpuj±ce ograniczenia systemowe:
MSGMAX
Maksymalny rozmiar danych komunikatu: ta implementacja ogranicza wielko¶æ do 8192 bajty.
MSGMNB
Domy¶lny maksymalny ³±czny rozmiar (w bajtach) wszystkich komunikatów w kolejce: 16384 bajty. Administrator systemu mo¿e przekroczyæ to ograniczenie, przy pomocy wywo³ania msgctl.

W tej implementacji nie ma jawnego systemowego ograniczenia liczby komunikatów przechowywanych w kolejce (MSGTQL) i na rozmiar obszaru (w bajtach) przeznaczonego na komunikaty (MSGPOOL).

ZGODNE Z

SVr4, SVID.

UWAGA

Parametr bêd±cy wska¼nikiem jest w ibc4, libc5, glibc 2.0 i glibc 2.1 zadeclarowany jako struct msgbuf *. W glibc 2.2 jest zadeklarowany jako void * (const void * dla msgsnd()), zgodnie z SUSv2.

ZOBACZ TAK¯E

ipc(5), msgctl(2), msgget(2), msgrcv(2), msgsnd(2)