Provided by: manpages-pl-dev_0.5-1_all bug

NAZWA

       msgrcv, msgsnd - przekazywanie komunikatów kolejki Systemu V

SKŁADNIA

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

       int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);

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

OPIS

       Wywołań  systemowych  msgsnd()  i   msgrcv()  używa  się  do  -  odpowiednio  -  wysyłania
       komunikatów do kolejki komunikatów i odbierania  komunikatów  z  kolejki  Systemu  V.  Aby
       wysłać   komunikat,   proces  wywołujący  musi  mieć  uprawnienie  do  zapisu  na  kolejce
       komunikatów, a aby odebrać komunikat - uprawnienie do odczytu kolejki.

       Parametr msgp jest wskaźnikiem do zdefiniowanej przez proces wywołujący struktury,  której
       ogólna postać wygląda tak:

           struct msgbuf {
               long mtype;       /* typ wiadomości, musi być > 0 */
               char mtext[1];    /* dane wiadomości */
           };

       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.
       niezawierają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  opis  msgrcv()
       poniżej).

   msgsnd()
       Wywołanie systemowe msgsnd() dołącza kopię komunikatu wskazywanego przez msgp do kolejki o
       identyfikatorze określonym przez msqid.

       Gdy w kolejce  jest  wystarczająco  dużo  miejsca,  to  msgsnd()  natychmiast  kończy  się
       pomyślnie.   (Pojemność   kolejki  określona  jest  w  polu  msg_qbytes  struktury  danych
       stowarzyszonej z kolejką. Podczas tworzenia kolejki polu temu  jest  przypisywana  wartość
       początkowa  wynosząca  MSGMNB bajtów, lecz ograniczenie to może zostać zmienione za pomocą
       msgctl(2)). Gdy w kolejce nie ma  miejsca,  to  domyślne  zachowanie  msgsnd()  polega  na
       wstrzymaniu  wykonywania  funkcji  do czasu, gdy miejsce stanie się dostępne. 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 się także nie powieść, jeżeli:

       * kolejka  zostanie  usunięta z systemu - w tym przypadku wywołanie systemowe zgłosi błąd,
         przypisując zmiennej errno wartość EIDRM;

       * zostanie przechwycony sygnał - wtedy wywołanie to powoduje  przypisanie  zmiennej  errno
         wartości  EINTR;  patrz signal(7) (msgsnd() po przerwaniu przez obsługę sygnału nie jest
         nigdy  automatycznie  restartowane,  niezależnie  od  ustawienia  znacznika   SA_RESTART
         podanego podczas ustanawiania funkcji obsługi sygnału).

       Jeśli  operacja  zakończy  się  pomyślnie,  to struktura danych opisująca kolejkę zostanie
       zmodyfikowana w następujący sposób:

              msg_lspid przypisany zostanie identyfikator procesu wykonującego tę operację.

              msg_qnum zostanie zwiększone o 1.

              msg_stime zostanie przypisany bieżący czas.

   msgrcv()
       Wywołanie systemowe msgrcv usuwa komunikat z kolejki określonej przez msqid i umieszcza go
       w buforze wskazywanym przez parametr msgp.

       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, to wynik  zależy  od
       tego,  czy  w  msgflg przekazano znacznik MSG_NOERROR. Jeżeli podano MSG_NOERROR, to tekst
       komunikatu zostanie obcięty (obcięta część  zostanie  utracona);  jeżeli  MSG_NOERROR  nie
       występuje,  to  komunikat  nie  jest  usuwany  z kolejki, a wywołanie systemowe kończy się
       błędem, zwracając wartość -1 i ustawiając errno na E2BIG.

       Parametr msgtyp określa rodzaj komunikatu w następujący sposób:

       * Jeśli msgtyp jest równy 0, to czytany jest pierwszy komunikat z kolejki.

       * Jeśli msgtyp ma wartość większą niż 0, to z kolejki odczytywany jest pierwszy  komunikat
         o  typie msgtyp, chyba że w parametrze msgflg zostanie ustawiony znacznik MSG_EXCEPT, co
         spowoduje, że z kolejki zostanie odczytany pierwszy komunikat o typie różnym od msgtyp.

       * Jeśli msgtyp ma wartość mniejszą  niż  0,  to  z  kolejki  zostanie  odczytany  pierwszy
         komunikat o najniższym numerze typu, mniejszym lub równym wartości bezwzględnej msgtyp.

       Parametr  msgflg  jest  maską  bitową,  utworzoną  jako  alternatywa  (OR) zera lub więcej
       następujących znaczników:

       IPC_NOWAIT
              Nie wstrzymuje pracy procesu, jeśli w  kolejce  nie  ma  komunikatów  odpowiedniego
              typu.  Wywołanie  systemowe zwróci wówczas błąd, przypisując zmiennej errno wartość
              ENOMSG.

       MSG_EXCEPT
              Użyte z parametrem msgtyp większym od 0, spowoduje odczytanie z kolejki  pierwszego
              komunikatu o typie różnym od 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, a znacznik IPC_NOWAIT nie
       został ustawiony 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 przechwytuje sygnał. W takim przypadku wywołanie systemowe kończy  się
         niepowodzeniem, ustawiając errno na EINTR. (msgrcv() po przerwaniu przez obsługę sygnału
         nie  jest  nigdy  automatycznie  restartowane,  niezależnie  od   ustawienia   znacznika
         SA_RESTART podczas ustanawiania funkcji obsługi sygnału).

       Jeśli  operacja  zakończy  się  pomyślnie,  to struktura danych opisująca kolejkę zostanie
       zmodyfikowana w następujący sposób:

              msg_lrpid przyjmie wartość równą identyfikatorowi wołającego procesu

              msg_qnum zostanie zmniejszone o 1.

              msg_rtime zostanie przypisany bieżący 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, a msgrvc() zwróci
       liczbę bajtów skopiowanych z kolejki do tablicy mtext.

BŁĘDY

       Jeśli wywołanie msgsnd() się nie powiedzie, to zmienna errno przyjmie jedną  z  poniższych
       wartości:

       EACCES Proces  wywołujący  nie  ma  prawa  do zapisu danej kolejki komunikatów, ani nie ma
              ustawionego atrybutu  CAP_IPC_OWNER.

       EAGAIN Komunikat nie może zostać wysłany  z  powodu  ograniczenia  msg_qbytes  dotyczącego
              kolejki, a nie przekazano znacznika IPC_NOWAIT w parametrze mgsflg.

       EFAULT Adres wskazywany przez msgp jest niedostępny.

       EIDRM  Kolejka komunikatów została 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 komunikatu wskazywanego przez msgp.

       Jeśli wywołanie msgrcv() się nie powiedzie, to zmiennej errno zostanie przypisana jedna  z
       poniższych wartości:

       E2BIG  Tekst  komunikatu  jest  dłuższy  niż msgsz i nie ustawiono znacznika MSG_NOERROR w
              parametrze msgflg.

       EACCES Proces wywołujący nie ma prawa do odczytu danej kolejki  komunikatów,  ani  nie  ma
              ustawionego atrybutu CAP_IPC_OWNER.

       EAGAIN Brak dostępnych komunikatów w kolejce, a podano IPC_NOWAIT w msgflg.

       EFAULT Adres wskazywany przez msgp jest niedostępny.

       EIDRM  Proces oczekiwał na komunikat, ale w międzyczasie kolejka została usunięta.

       EINTR  Proces  przechwycił  sygnał  podczas  oczekiwania  na  odebranie  komunikatu; patrz
              signal(7).

       EINVAL msgqid był niepoprawny lub msgsz był mniejszy od 0.

       ENOMSG Znacznik IPC_NOWAIT został przekazany w msgflg, ale w  kolejce  nie  ma  komunikatu
              żądanego typu.

ZGODNE Z

       SVr4, POSIX.1-2001.

UWAGI

       Dołączenie  <sys/types.h>  i  <sys/ipc.h>  nie jest wymagane na Linuksie ani przez żadną z
       wersji  POSIX.  Jednak  niektóre  stare  implementacje  wymagają  dołączenia  tych  plików
       nagłówkowych,  SVID również dokumentuje ich dołączenie. Aplikacje które mają być przenośne
       na tego typu stare systemy mogą wymagać dołączenia omawianych plików nagłówkowych.

       Parametr msgp jest deklarowany jako struct msgbuf * w libc4, libc5, glibc 2.0, glibc  2.1.
       W  glibc  2.2  i  późniejszych jest deklarowany jako void *, zgodnie z wymaganiami SUSv2 i
       SUSv3.

       Wywołania msgsnd() dotyczą następujące ograniczenia systemowe:

       MSGMAX Maksymalny rozmiar tekstu komunikatu: 8192 bajty  (pod  Linuksem  ten  limit  można
              odczytać i modyfikować, używając pliku /proc/sys/kernel/msgmax).

       MSGMNB Domyślny  maksymalny  łączny  rozmiar wszystkich komunikatów w kolejce: 16384 bajty
              (pod   Linuksem   można   ten   limit   odczytać   i   zmienić,   używając    pliku
              /proc/sys/kernel/msgmnb).  Administrator  systemu może za pomocą wywołania msgctl()
              ustawić rozmiar kolejki komunikatów na wartość większą niż MSGMNB.

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

ZOBACZ TAKŻE

       msgctl(2), msgget(2), capabilities(7), mq_overview(7), svipc(7)

O STRONIE

       Angielska wersja tej strony  pochodzi  z  wydania  3.52  projektu  Linux  man-pages.  Opis
       projektu   oraz   informacje   dotyczące  zgłaszania  błędów  można  znaleźć  pod  adresem
       http://www.kernel.org/doc/man-pages/.

TŁUMACZENIE

       Autorami polskiego tłumaczenia niniejszej strony podręcznika man są: Rafał  Lewczuk  (PTM)
       <R.Lewczuk@elka.pw.edu.p>,  Andrzej  Krzysztofowicz  (PTM)  <ankry@mif.pg.gda.pl>,  Robert
       Luberda <robert@debian.org> i Michał Kułach <michal.kulach@gmail.com>.

       Polskie tłumaczenie jest częścią projektu manpages-pl; uwagi, pomoc, zgłaszanie błędów  na
       stronie   http://sourceforge.net/projects/manpages-pl/.   Jest   zgodne   z  wersją   3.52
       oryginału.