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¶
Uwaga! To tłumaczenie może być nieaktualne!
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)
Powyższe tłumaczenie pochodzi z nieistniejącego już Projektu
Tłumaczenia Manuali i
może nie być aktualne. W razie
zauważenia różnic między powyższym opisem a
rzeczywistym zachowaniem opisywanego programu lub funkcji, prosimy o
zapoznanie się z oryginalną (angielską) wersją strony
podręcznika za pomocą polecenia:
- man --locale=C 2 msgop
Prosimy o pomoc w aktualizacji stron man - więcej informacji można
znaleźć pod adresem
http://sourceforge.net/projects/manpages-pl/.