.\" -*- coding: UTF-8 -*-
.\" Copyright 1993 Giorgio Ciucci <giorgio@crcc.it>
.\" and Copyright 2015 Bill Pemberton <wfp5p@worldbroken.com>
.\"
.\" SPDX-License-Identifier: Linux-man-pages-copyleft
.\"
.\" Modified Tue Oct 22 16:40:11 1996 by Eric S. Raymond <esr@thyrsus.com>
.\" Modified Mon Jul 10 21:09:59 2000 by aeb
.\" Modified 1 Jun 2002, Michael Kerrisk <mtk.manpages@gmail.com>
.\"	Language clean-ups.
.\"	Enhanced and corrected information on msg_qbytes, MSGMNB and MSGMAX
.\"	Added note on restart behavior of msgsnd() and msgrcv()
.\"	Formatting clean-ups (argument and field names marked as .I
.\"		instead of .B)
.\" Modified, 27 May 2004, Michael Kerrisk <mtk.manpages@gmail.com>
.\"     Added notes on capability requirements
.\" Modified, 11 Nov 2004, Michael Kerrisk <mtk.manpages@gmail.com>
.\"	Language and formatting clean-ups
.\"	Added notes on /proc files
.\"
.\"*******************************************************************
.\"
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
.TH MSGOP 2 "15 czerwca 2024 r." "Linux man\-pages 6.9.1" 
.SH NAZWA
msgrcv, msgsnd \- przekazuje komunikaty kolejki Systemu V
.SH BIBLIOTEKA
Standardowa biblioteka C (\fIlibc\fP, \fI\-lc\fP)
.SH SKŁADNIA
.nf
\fB#include <sys/msg.h>\fP
.P
\fBint msgsnd(int \fP\fImsqid\fP\fB, const void \fP\fImsgp\fP\fB[.\fP\fImsgsz\fP\fB], size_t \fP\fImsgsz\fP\fB,\fP
\fB               int \fP\fImsgflg\fP\fB);\fP
.P
\fBssize_t msgrcv(int \fP\fImsqid\fP\fB, void \fP\fImsgp\fP\fB[.\fP\fImsgsz\fP\fB], size_t \fP\fImsgsz\fP\fB, long \fP\fImsgtyp\fP\fB,\fP
\fB               int \fP\fImsgflg\fP\fB);\fP
.fi
.SH OPIS
Wywołań systemowych \fBmsgsnd\fP() i  \fBmsgrcv\fP() używa się do 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.
.P
Parametr \fImsgp\fP jest wskaźnikiem do zdefiniowanej przez proces wywołujący
struktury, której ogólna postać wygląda tak:
.P
.in +4n
.EX
struct msgbuf {
    long mtype;       /* typ wiadomości, musi być > 0 */
    char mtext[1];    /* dane wiadomości */
};
.EE
.in
.P
Pole \fImtext\fP jest tablicą (lub inna strukturą) o rozmiarze określonym przez
\fImsgsz\fP, będącym nieujemną liczbą całkowitą. Dozwolone są komunikaty o
zerowej długości (tzn. niezawierające pola \fImtext\fP). Wartość pola \fImtype\fP
musi być liczbą ściśle dodatnią, która może służyć procesowi odbierającemu
komunikaty do filtrowania kolejki (zobacz opis \fBmsgrcv\fP() poniżej).
.SS msgsnd()
Wywołanie systemowe \fBmsgsnd\fP() dołącza kopię komunikatu wskazywanego przez
\fImsgp\fP do kolejki o identyfikatorze określonym przez \fImsqid\fP.
.P
Gdy w kolejce jest wystarczająco dużo miejsca, to \fBmsgsnd\fP() natychmiast
kończy się pomyślnie. (Pojemność kolejki określona jest w polu \fImsg_qbytes\fP
struktury danych stowarzyszonej z kolejką. Podczas tworzenia kolejki polu
temu jest przypisywana wartość początkowa wynosząca \fBMSGMNB\fP bajtów, lecz
ograniczenie to może zostać zmienione za pomocą \fBmsgctl\fP(2)). Kolejka
komunikatów jest uważana za pełną w jednym z następujących przypadków:
.IP \[bu] 3
Dodanie nowego komunikatu do kolejki spowoduje, że suma bajtów w kolejki
przekroczy maksymalny rozmiar kolejki (pole \fImsg_qbytes\fP).
.IP \[bu]
Dodanie kolejnego komunikatu do kolejki spowoduje, że całkowita liczba
komunikatów w kolejce przekroczy maksymalny rozmiar kolejki (pole
\fImsg_qbytes\fP). To sprawdzenie jest konieczne aby zapobiec umieszczaniu w
kolejce nieograniczonej liczby komunikatów o zerowej długości. Choć takie
komunikaty nie zawierają danych, to wciąż zajmują (zablokowaną) pamięć
jądra.
.P
Jeśli w kolejce obecna jest niewystarczająca ilość wolnego miejsca, to
domyślne zachowaniem \fBmsgsnd\fP() jest blokada do momentu uzyskania wolnej
przestrzeni. Jeśli w \fImsgflg\fP określono \fBIPC_NOWAIT\fP, to zamiast tego
wywołanie zwróci błąd \fBEAGAIN\fP.
.P
Wstrzymane wywołanie \fBmsgsnd\fP() może się także nie powieść, jeżeli:
.IP \[bu] 3
kolejka zostanie usunięta z systemu \- w tym przypadku wywołanie systemowe
zgłosi błąd, przypisując zmiennej \fIerrno\fP wartość \fBEIDRM\fP;
.IP \[bu]
zostanie przechwycony sygnał \- wtedy wywołanie to powoduje przypisanie
zmiennej \fIerrno\fP wartości \fBEINTR\fP; patrz \fBsignal\fP(7) (\fBmsgsnd\fP() po
przerwaniu przez obsługę sygnału nie jest nigdy automatycznie restartowane,
niezależnie od ustawienia znacznika \fBSA_RESTART\fP podanego podczas
ustanawiania funkcji obsługi sygnału).
.P
Jeśli operacja zakończy się pomyślnie, to struktura danych opisująca kolejkę
zostanie zmodyfikowana w następujący sposób:
.IP \[bu] 3
\fImsg_lspid\fP przypisany zostanie identyfikator procesu wykonującego tę
operację.
.IP \[bu]
\fImsg_qnum\fP zostanie zwiększone o 1.
.IP \[bu]
\fImsg_stime\fP zostanie przypisany bieżący czas.
.SS msgrcv()
Wywołanie systemowe \fBmsgrcv\fP usuwa komunikat z kolejki określonej przez
\fImsqid\fP i umieszcza go w buforze wskazywanym przez parametr \fImsgp\fP.
.P
Parametr \fImsgsz\fP określa maksymalny rozmiar w bajtach pola \fImtext\fP
struktury wskazywanej przez parametr \fImsgp\fP. Jeśli dane komunikatu zajmują
więcej bajtów niż \fImsgsz\fP, to wynik zależy od tego, czy w \fImsgflg\fP
przekazano znacznik \fBMSG_NOERROR\fP. Jeżeli podano \fBMSG_NOERROR\fP, to tekst
komunikatu zostanie obcięty (obcięta część zostanie utracona); jeżeli
\fBMSG_NOERROR\fP 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
\fIerrno\fP na \fBE2BIG\fP.
.P
Jeżeli podano \fBMSG_COPY\fP w \fImsgflg\fP (zob. poniżej), parametr \fImsgtyp\fP
określa rodzaj komunikatu w następujący sposób:
.IP \[bu] 3
Jeśli \fImsgtyp\fP jest równy 0, to czytany jest pierwszy komunikat z kolejki.
.IP \[bu]
Jeśli \fImsgtyp\fP ma wartość większą niż 0, to z kolejki odczytywany jest
pierwszy komunikat o typie \fImsgtyp\fP, chyba że w parametrze \fImsgflg\fP
zostanie ustawiony znacznik \fBMSG_EXCEPT\fP, co spowoduje, że z kolejki
zostanie odczytany pierwszy komunikat o typie różnym od \fImsgtyp\fP.
.IP \[bu]
Jeśli \fImsgtyp\fP 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 \fImsgtyp\fP.
.P
Parametr \fImsgflg\fP jest maską bitową, utworzoną jako alternatywa (OR) zera
lub więcej  następujących znaczników:
.TP 
\fBIPC_NOWAIT\fP
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 \fIerrno\fP wartość \fBENOMSG\fP.
.TP 
\fBMSG_COPY\fP (od Linuksa 3.8)
.\" commit 4a674f34ba04a002244edaf891b5da7fc1473ae8
Nieniszcząco pobiera kopię komunikatu na pozycji porządkowej w kolejce,
określonej przez \fImsgtyp\fP (komunikaty są rozważane jako numerowane od 0).
.IP
Ten znacznik należy podać w połączeniu z \fBIPC_NOWAIT\fP, co skutkuje tym, że
jeśli w danej pozycji nie ma dostępnego komunikatu, to wywołanie natychmiast
zwraca błąd \fBENOMSG\fP. Ponieważ zmienia to znaczenie \fImsgtyp\fP w różny
sposób, \fBMSG_COPY\fP i \fBMSG_EXCEPT\fP nie mogą być podane równocześnie w
\fImsgflg\fP.
.IP
Znacznik \fBMSG_COPY\fP został dodany dla zaimplementowania w jądrze funkcji
przywracania do punktu kontrolnego (checkpoint\-restore) i jest dostępny
wyłącznie wtedy, jeśli jądro zbudowano z opcją \fBCONFIG_CHECKPOINT_RESTORE\fP.
.TP 
\fBMSG_EXCEPT\fP
Użyte z parametrem \fImsgtyp\fP większym od 0, spowoduje odczytanie z kolejki
pierwszego komunikatu o typie różnym od \fImsgtyp\fP.
.TP 
\fBMSG_NOERROR\fP
Spowoduje obcięcie komunikatu, jeśli jego dane są dłuższe niż \fImsgsz\fP
bajtów.
.P
Jeśli w kolejce nie ma komunikatu spełniającego te warunki, a znacznik
\fBIPC_NOWAIT\fP nie został ustawiony w \fImsgflg\fP, to proces zostanie
wstrzymany, dopóki nie nastąpi jedno z poniższych zdarzeń:
.IP \[bu] 3
Komunikat odpowiedniego typu zostanie umieszczony w kolejce.
.IP \[bu]
Kolejka zostanie usunięta z systemu. W tym przypadku wywołanie systemowe
zgłosi błąd, przypisując zmiennej \fIerrno\fP wartość \fBEIDRM\fP.
.IP \[bu]
Proces wywołujący przechwyci sygnał. W takim przypadku wywołanie systemowe
kończy się niepowodzeniem, ustawiając \fIerrno\fP na \fBEINTR\fP. (\fBmsgrcv\fP() po
przerwaniu przez obsługę sygnału nie jest nigdy automatycznie restartowane,
niezależnie od ustawienia znacznika \fBSA_RESTART\fP podczas ustanawiania
funkcji obsługi sygnału).
.P
Jeśli operacja zakończy się pomyślnie, to struktura danych opisująca kolejkę
zostanie zmodyfikowana w następujący sposób:
.IP
\fImsg_lrpid\fP przyjmie wartość równą identyfikatorowi wołającego procesu
.IP
\fImsg_qnum\fP zostanie zmniejszone o 1.
.IP
\fImsg_rtime\fP zostanie przypisany bieżący czas.
.SH "WARTOŚĆ ZWRACANA"
W przypadku powodzenia, \fBmsgsnd\fP() zwróci 0, a \fBmsgrvc\fP() zwróci liczbę
bajtów skopiowanych z kolejki do tablicy \fImtext\fP. W przypadku błędu,
obydwie funkcje zwrócą \-1 i ustawią \fIerrno\fP, wskazując błąd.
.SH BŁĘDY
\fBmsgsnd\fP() może zawieść z powodu następujących błędów:
.TP 
\fBEACCES\fP
Proces wywołujący nie ma prawa do zapisu kolejki komunikatów, ani nie ma
przywileju \fBCAP_IPC_OWNER\fP (ang. capability) w przestrzeni nazw
użytkownika, która zarządza jego przestrzenią nazw IPC.
.TP 
\fBEAGAIN\fP
Komunikat nie może zostać wysłany z powodu ograniczenia \fImsg_qbytes\fP
dotyczącego kolejki, a nie przekazano znacznika \fBIPC_NOWAIT\fP w parametrze
\fImgsflg\fP.
.TP 
\fBEFAULT\fP
Adres wskazywany przez \fImsgp\fP jest niedostępny.
.TP 
\fBEIDRM\fP
Kolejka komunikatów została usunięta.
.TP 
\fBEINTR\fP
Podczas oczekiwania na zwolnienie miejsca w kolejce, proces przechwycił
sygnał.
.TP 
\fBEINVAL\fP
Niewłaściwa wartość \fImsqid\fP, \fImtype\fP (powinna być dodatnia) lub \fImsgsz\fP
(powinna być większa lub równa \fB0\fP i mniejsza lub równa \fBMSGMAX\fP).
.TP 
\fBENOMEM\fP
Brak w systemie pamięci na skopiowanie komunikatu wskazywanego przez
\fImsgp\fP.
.P
\fBmsgrcv\fP() może zawieść z powodu następujących błędów:
.TP 
\fBE2BIG\fP
Tekst komunikatu jest dłuższy niż \fImsgsz\fP i nie ustawiono znacznika
\fBMSG_NOERROR\fP w parametrze \fImsgflg\fP.
.TP 
\fBEACCES\fP
Proces wywołujący nie ma prawa do odczytu kolejki komunikatów, ani nie ma
przywileju \fBCAP_IPC_OWNER\fP (ang. capability) w przestrzeni nazw
użytkownika, która zarządza jego przestrzenią nazw IPC.
.TP 
\fBEFAULT\fP
Adres wskazywany przez \fImsgp\fP jest niedostępny.
.TP 
\fBEIDRM\fP
Proces oczekiwał na komunikat, ale w międzyczasie kolejka została usunięta.
.TP 
\fBEINTR\fP
Proces przechwycił sygnał podczas oczekiwania na odebranie komunikatu; patrz
\fBsignal\fP(7).
.TP 
\fBEINVAL\fP
\fImsqid\fP był niepoprawny lub \fImsgsz\fP był mniejszy od 0.
.TP 
\fBEINVAL\fP (od Linuksa 3.14)
\fImsgflg\fP określono jako \fBMSG_COPY\fP, ale nie \fBIPC_NOWAIT\fP.
.TP 
\fBEINVAL\fP (od Linuksa 3.14)
\fImsgflg\fP określono jako \fBMSG_COPY\fP i \fBMSG_EXCEPT\fP.
.TP 
\fBENOMSG\fP
Znacznik \fBIPC_NOWAIT\fP został przekazany w \fImsgflg\fP, ale w kolejce nie ma
komunikatu żądanego typu.
.TP 
\fBENOMSG\fP
\fBIPC_NOWAIT\fP i \fBMSG_COPY\fP zostały określone w \fImsgflg\fP, a kolejka zawiera
mniej niż \fImsgtyp\fP komunikatów.
.TP 
\fBENOSYS\fP (od Linuksa 3.8)
W \fImsgflg\fP określono \fBMSG_COPY\fP i \fBIPC_NOWAIT\fP, a jądro zostało
skonfigurowane bez opcji \fBCONFIG_CHECKPOINT_RESTORE\fP.
.SH STANDARDY
POSIX.1\-2008.
.P
.\" MSG_COPY since glibc 2.18
Znaczniki \fBMSG_EXCEPT\fP i \fBMSG_COPY\fP są charakterystyczne dla Linuksa, ich
definicje można pobrać przez zdefiniowane makra testującego funkcje
\fB_GNU_SOURCE\fP.
.SH HISTORIA
POSIX.1\-2001, SVr4.
.P
Parametr \fImsgp\fP jest deklarowany jako \fIstruct msgbuf\ *\fP w glibc 2.0 i
glibc 2.1. W glibc 2.2 i późniejszych jest deklarowany jako \fIvoid\ *\fP,
zgodnie z wymaganiami SUSv2 i SUSv3.
.SH UWAGI
Wywołania \fBmsgsnd\fP() dotyczą następujące ograniczenia systemowe:
.TP 
\fBMSGMAX\fP
Maksymalny rozmiar tekstu komunikatu, w bajtach: (domyślna wartość: 8192
bajty). Pod Linuksem ten limit można odczytać i modyfikować, używając pliku
\fI/proc/sys/kernel/msgmax\fP.
.TP 
\fBMSGMNB\fP
Maksymalna liczba bajtów, która może być przechowywana w kolejce komunikatów
(domyślna wartość: 16384 bajtów). Pod Linuksem można ten limit odczytać i
zmienić, używając pliku \fI/proc/sys/kernel/msgmnb\fP. Proces uprzywilejowany
(w Linuksie: proces z przywilejem \fBCAP_SYS_RESOURCE\fP) może zwiększyć
rozmiar kolejki komunikatów poza \fBMSGMNB\fP za pomocą operacji \fBIPC_SET\fP
\fBmsgctl\fP(2).
.P
W tej implementacji nie ma jawnego systemowego ograniczenia liczby
komunikatów przechowywanych w kolejce (\fBMSGTQL\fP) i na rozmiar obszaru (w
bajtach) przeznaczonego na komunikaty (\fBMSGPOOL\fP).
.SH USTERKI
.\" http://marc.info/?l=linux-kernel&m=139048542803605&w=2
.\" commit 4f87dac386cc43d5525da7a939d4b4e7edbea22c
W Linuksie 3.13 i wcześniejszych, jeśli \fBmsgrcv\fP() było wywołane ze
znacznikiem \fBMSG_COPY\fP, lecz bez \fBIPC_NOWAIT\fP, a kolejka komunikatów
zawierała mniej niż \fImsgtyp\fP komunikatów, to wywołanie było zablokowane aż
do zapisania kolejnego komunikatu do kolejki. W tym momencie wywołanie
zwracało kopię komunikatu \fIbez względu\fP na to czy komunikat był w pozycji
\fImsgtyp\fP. Błąd ten został naprawiony w jądrze Linux 3.14.
.P
.\" http://marc.info/?l=linux-kernel&m=139048542803605&w=2
.\" commit 4f87dac386cc43d5525da7a939d4b4e7edbea22c
Podanie zarówno w \fImsgflg\fP zarówno \fBMSG_COPY\fP jak i \fBMSC_EXCEPT\fP jest
błędem logicznym (ponieważ oba te znaczniki wymagają innej interpretacji
\fImsgtyp\fP). W Linuksie 3.13 i wcześniejszych, błąd ten nie był diagnozowany
przez \fImsgsrv\fP(). Zostało to naprawione w jądrze Linux 3.14.
.SH PRZYKŁADY
Program poniżej demonstruje użycie \fBmsgsnd\fP() i \fBmsgrcv\fP().
.P
Przykładowy program jest początkowo uruchomiony z opcją \fB\-s\fP, aby wysłać
komunikat, a następnie ponownie z opcją \fB\-r\fP, aby otrzymać komunikat.
.P
Poniższa sesja powłoki pokazuje przykładowy przebieg programu:
.P
.in +4n
.EX
$\fB ./a.out \-s\fP
wysłano: a message at Wed Mar  4 16:25:45 2015
.P
$\fB ./a.out \-r\fP
komunikat otrzymano: a message at Wed Mar  4 16:25:45 2015
.EE
.in
.SS "Kod źródłowy programu"
.\" SRC BEGIN (msgop.c)
\&
.EX
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <time.h>
#include <unistd.h>
\&
struct msgbuf {
    long mtype;
    char mtext[80];
};
\&
static void
usage(char *prog_name, char *msg)
{
    if (msg != NULL)
        fputs(msg, stderr);
\&
    fprintf(stderr, "Użycie: %s [opcje]\[rs]n", nazwa_prog);
    fprintf(stderr, "Opcje:\[rs]n");
    fprintf(stderr, "\-s        wysyła komunikat przez msgsnd()\[rs]n");
    fprintf(stderr, "\-r        odczytuje komunikat przez msgrcv()\[rs]n");
    fprintf(stderr, "\-t        typ komunikatu (domyślnie: 1)\[rs]n");
    fprintf(stderr, "\-k        klucz kolejki komunikatu (domyślnie: 1234)\[rs]n");
    exit(EXIT_FAILURE);
}
\&
static void
send_msg(int qid, int msgtype)
{
    time_t         t;
    struct msgbuf  msg;
\&
    msg.mtype = msgtype;
\&
    time(&t);
    snprintf(msg.mtext, sizeof(msg.mtext), "wiadomość o %s",
             ctime(&t));
\&
    if (msgsnd(qid, &msg, sizeof(msg.mtext),
               IPC_NOWAIT) == \-1)
    {
        perror("błąd msgsnd");
        exit(EXIT_FAILURE);
    }
    printf("wysłano: %s\[rs]n", msg.mtext);
}
\&
static void
get_msg(int qid, int msgtype)
{
    struct msgbuf msg;
\&
    if (msgrcv(qid, &msg, sizeof(msg.mtext), msgtype,
               MSG_NOERROR | IPC_NOWAIT) == \-1) {
        if (errno != ENOMSG) {
            perror("msgrcv");
            exit(EXIT_FAILURE);
        }
        printf("Brak komunikatu dostępnego dla msgrcv()\[rs]n");
    } else {
        printf("komunikat otrzymano: %s\[rs]n", msg.mtext);
    }
}
\&
int
main(int argc, char *argv[])
{
    int  qid, opt;
    int  mode = 0;               /* 1 = wysłanie, 2 = otrzymanie */
    int  msgtype = 1;
    int  msgkey = 1234;
\&
    while ((opt = getopt(argc, argv, "srt:k:")) != \-1) {
        switch (opt) {
        case \[aq]s\[aq]:
            mode = 1;
            break;
        case \[aq]r\[aq]:
            mode = 2;
            break;
        case \[aq]t\[aq]:
            msgtype = atoi(optarg);
            if (msgtype <= 0)
                usage(argv[0], "opcja \-t musi być większa od 0\[rs]n");
            break;
        case \[aq]k\[aq]:
            msgkey = atoi(optarg);
            break;
        default:
            usage(argv[0], "Nierozpoznana opcja\[rs]n");
        }
    }
\&
    if (mode == 0)
        usage(argv[0], "musi być opcją \-s albo \-r\[rs]n");
\&
    qid = msgget(msgkey, IPC_CREAT | 0666);
\&
    if (qid == \-1) {
        perror("msgget");
        exit(EXIT_FAILURE);
    }
\&
    if (mode == 2)
        get_msg(qid, msgtype);
    else
        send_msg(qid, msgtype);
\&
    exit(EXIT_SUCCESS);
}
.EE
.\" SRC END
.SH "ZOBACZ TAKŻE"
\fBmsgctl\fP(2), \fBmsgget\fP(2), \fBcapabilities\fP(7), \fBmq_overview\fP(7),
\fBsysvipc\fP(7)
.PP
.SH TŁUMACZENIE
Tłumaczenie niniejszej strony podręcznika:
Rafał Lewczuk <R.Lewczuk@elka.pw.edu.p>,
Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl>,
Robert Luberda <robert@debian.org>
i
Michał Kułach <michal.kulach@gmail.com>
.
.PP
Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach
licencji można uzyskać zapoznając się z
.UR https://www.gnu.org/licenses/gpl-3.0.html
GNU General Public License w wersji 3
.UE
lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.
.PP
Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy
dyskusyjnej
.MT manpages-pl-list@lists.sourceforge.net
.ME .
