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/.