Provided by:
manpages-pl-dev_20060617-3_all 
NAZWA
msgop - przekazywanie komunikatow
SK/LADNIA
#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 wyslania lub odebrania komunikatu, proces powinien zaalokowa
struktur danych o nastpujcej postaci ogolnej:
struct msgbuf {
long mtype; /* rodzaj komunikatu, musi by > 0 */
char mtext[1]; /* przekazywane dane */
};
Pole mtext jest tablic (lub inna struktur) o rozmiarze okrelonym przez
msgsz, bdcym nieujemn liczb calkowit. Dozwolone s komunikaty o zerowej
dlugoci (tzn. nie zawierajce pola mtext) Warto pola mtype musi by liczb
cile dodatni, ktora moe sluy procesowi odbierajcemu komunikaty do
filtrowania kolejki. (zobacz cz dotyczc msgrcv).
Proces wywolujcy funkcj musi mie prawo zapisu do kolejki, aby wysla
komunikat, natomiast prawo odczytu jest niezbdne, aby komunikat odebra.
Wywolanie systemowe msgsnd dolcza kopi komunikatu wskazywanego przez
msgp do kolejki o identyfikatorze okrelonym przez msqid.
Gdy w kolejce jest do miejsca, msgsnd koczy si pomylnie natychmiast
(Pojemno kolejki okrelona jest w polu msg_bytes struktury danych
stowarzyszonej z kolejk. Podczas tworzenia kolejki nadawana jest mu
warto inicjalna wynoszca MSGMNB bajtow, lecz ograniczenie to moe zosta
zmienione za pomoc msgctl.) Gdy w kolejce nie ma do miejsca, to
domylne zachowanie msgsnd polega na wstrzymaniu wykonywania funkcji do
czasu, gdy miejsce stanie si dostpne. If Ustawienie w msgflg znacznika
IPC_NOWAIT spowoduje, e zamiast tego wywolanie systemowe zakoczy si
niepomylnie, zglaszajc bld EAGAIN.
Wstrzymane wywolanie msgsnd moe rownie zakoczy si niepomylnie, gdy
kolejka zostanie usunita (i wtedy wywolanie to powoduje przypisanie
zmiennej errno wartoci EIDRM), lub gdy zostanie przechwycony sygnal (i
wtedy wywolanie to powoduje przypisanie zmiennej errno wartoci EINTR).
(msgsnd i msgrcv po przerwaniu przez obslug sygnalu nie s nigdy
automatycznie restartowane, nie zalenie od ustawienia znacznika
SA_RESTART podczas ustanaiwiania funkcji obslugi sygnalu.)
W wyniku pomylnego wykonania operacji, struktura danych opisujca kolejk
komunikatow zostanie zmodyfikowana nastpujco:
msg_lspid przypisany zostanie identyfikator procesu wykonujcego
t operacj.
msg_qnum zostanie zwikszone o 1
msg_stime zostanie przypisany aktualny czas.
Wywolanie systemowe msgrcv odczyta komunikat z kolejki wskazanej przez
parametr msqid do struktury msgbuf wskazywanej przez parametr msgp
usuwajc odczytany komunikat z kolejki.
Parametr msgsz okrela maksymalny rozmiar (w bajtach) pola mtext
struktury wskazywanej przez parametr msgp. Jeli dane komunikatu zajmuj
wicej bajtow, ni msgsz, a parametr msgflg zawiera znacznik MSG_NOERROR,
wowczas dane komunikatu zostan obcite (obcita cz zostanie utracona).
Jeli znacznik nie jest ustawiony a (a komunikat jest za dlugi), wowczas
nie zostanie on usunity z kolejki, natomiast system zglosi bld a
zmiennej errno zostanie przypisana warto E2BIG.
Parametr msgtyp okrela rodzaj komunikatu w nastpujcy sposob:
Jeli msgtyp jest rowny 0, to czytany jest pierwszy dostpny
komunikat w kolejce (czyli najdawniej wyslany).
Jeli msgtyp ma warto wiksz 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.
Jeli msgtyp ma warto mniejsz ni 0, to z kolejki zostanie
odczytany pierwszy komunikat o najniszym numerze typu, o ile
jest on mniejszy lub rowny wartoci bezwzgldnej msgtyp .
Parametr msgflg zawiera bitow alternatyw (OR) adnego, jednego lub wicej
sporod nastpujcych znacznikow:
IPC_NOWAIT Wywolanie nie bdzie wstrzymywa pracy procesu, jeli w
kolejce nie ma komunikatow odpowiedniego typu. Wywolanie
systemowe zglosi wowczas bld, przypisujc zmiennej errno warto
ENOMSG.
MSG_EXCEPT Uywane jest wtedy, gdy msgtyp ma warto wiksz ni 0,
spowoduje odczytanie z kolejki pierwszego komunikatu innego
typu, ni msgtyp.
MSG_NOERROR Spowoduje obcicie komunikatu, jeli jego dane s
dlusze ni msgsz bajtow.
Jeli w kolejce nie ma komunikatu spelniajcego te warunki, za znacznik
IPC_NOWAIT nie zostal przekazany w msgflg, to proces zostanie
wstrzymany, dopoki nie nastpi jedno z poniszych zdarze:
Komunikat odpowiedniego typu zostanie umieszczony w kolejce.
Kolejka zostanie usunita z systemu. W tym przypadku wywolanie
systemowe zglosi bld, przypisujc zmiennej errno warto EIDRM.
Proces wywolujcy otrzyma sygnal wymagajcy przechwycenia. W tym
przypadku wywolanie systemowe zglosi bld, przypisujc zmiennej
errno warto EINTR.
Jeli operacja zakoczy si pomylnie, to struktura danych opisujca kolejk
zostanie nastpujco zmodyfikowana:
msg_lrpid przyjmie warto rown identyfikatorowi wolajcego procesu
msg_qnum zostanie zmniejszone o 1.
msg_rtime zostanie przypisany aktualny czas.
WARTO ZWRACANA
W przypadku niepowodzenia, obydwa wywolania zwroc -1 i przypisz
zmiennej errno warto okrelajc rodzaj bldu. W przeciwnym przypadku,
msgsnd zwroci 0, za msgrvc zwroci liczb bajtow skopiowanych z kolejki
do tablicy mtext.
B/LDY
Jeli wywolanie msgsnd nie powiedzie si, to zmienna errno przyjmie jedn
z poniszych wartoci:
EAGAIN Komunikat nie moe zosta wyslany do kolejki, z powodu
ograniczenia msg_qbytes, a znacznik IPC_NOWAIT zostal
przekazany w parametrze mgsflg.
EACCES Proces nie ma prawa zapisu do kolejki komunikatow.
EFAULT dres wskazywany przez msgp jest niedostpny.
EIDRM Kolejka zostala w midzyczasie usunita.
EINTR Podczas oczekiwania na zwolnienie miejsca w kolejce, proces
przechwycil sygnal.
EINVAL Niewlaciwa warto msqid, mtype (powinna by dodatnia) lub
msgsz (powinna by wiksza lub rowna 0 i mniejsza lub rowna
MSGMAX).
ENOMEM Brak w systemie pamici na skopiowanie podanego msgbuf.
Jeli wywolanie msgrcv nie powiedzie si, to zmiennej errno zostanie
przypisana jedna z poniszych wartoci:
E2BIG Tekst komunikatu jest dluszy ni msgsz , za znacznik
MSG_NOERROR nie zostal w parametrze msgflg ustawiony.
EACCES Proces nie ma prawa do odczytu danej kolejki komunikatow.
EFAULT Adres wskazywany przez msgp jest niedostpny.
EIDRM Proces oczekiwal na komunikat, ale w midzyczasie kolejka
zostala usunita.
EINTR Proces oczekiwal na komunikat, ale dotarl do niego jaki
wymagajcy obsluenia sygnal.
EINVAL Niewlaciwa warto msgqid lub msgsz (powinna by wiksza lub
rowna 0).
ENOMSG Znacznik IPC_NOWAIT zostal przekazany w msgflg , ale w
kolejce nie ma komunikatu danego typu.
UWAGI
Wywolanie msgsnd obowizuj nastpujce ograniczenia systemowe:
MSGMAX Maksymalny rozmiar danych komunikatu: ta implementacja
ogranicza wielko do 8192 bajty.
MSGMNB Domylny maksymalny lczny rozmiar (w bajtach) wszystkich
komunikatow w kolejce: 16384 bajty. Administrator systemu
moe przekroczy to ograniczenie, przy pomocy wywolania
msgctl.
W tej implementacji nie ma jawnego systemowego ograniczenia liczby
komunikatow przechowywanych w kolejce (MSGTQL) i na rozmiar obszaru (w
bajtach) przeznaczonego na komunikaty (MSGPOOL).
ZGODNE Z
SVr4, SVID.
UWAGA
Parametr bdcy wskanikiem 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 TAKE
ipc(5), msgctl(2), msgget(2), msgrcv(2), msgsnd(2)
INFORMACJE O T/LUMACZENIU
Powysze tlumaczenie pochodzi z nieistniejcego ju Projektu Tlumaczenia
Manuali i moe nie by aktualne. W razie zauwaenia ronic midzy powyszym
opisem a rzeczywistym zachowaniem opisywanego programu lub funkcji,
prosimy o zapoznanie si z oryginaln (angielsk) wersj strony podrcznika.