MSGOP(2)

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.