.\" -*- coding: UTF-8 -*- .\" Copyright 1993 Giorgio Ciucci .\" and Copyright 2015 Bill Pemberton .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\" Modified Tue Oct 22 16:40:11 1996 by Eric S. Raymond .\" Modified Mon Jul 10 21:09:59 2000 by aeb .\" Modified 1 Jun 2002, Michael Kerrisk .\" 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 .\" Added notes on capability requirements .\" Modified, 11 Nov 2004, Michael Kerrisk .\" 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 \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 #include #include #include #include #include #include \& struct msgbuf { long mtype; char mtext[80]; }; \& static void usage(char *prog_name, char *msg) { if (msg != NULL) fputs(msg, stderr); \& fprintf(stderr, "Usage: %s [options]\[rs]n", prog_name); fprintf(stderr, "Options are:\[rs]n"); fprintf(stderr, "\-s send message using msgsnd()\[rs]n"); fprintf(stderr, "\-r read message using msgrcv()\[rs]n"); fprintf(stderr, "\-t message type (default is 1)\[rs]n"); fprintf(stderr, "\-k message queue key (default is 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), "a message at %s", ctime(&t)); \& if (msgsnd(qid, &msg, sizeof(msg.mtext), IPC_NOWAIT) == \-1) { perror("msgsnd error"); exit(EXIT_FAILURE); } printf("sent: %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("No message available for msgrcv()\[rs]n"); } else { printf("message received: %s\[rs]n", msg.mtext); } } \& int main(int argc, char *argv[]) { int qid, opt; int mode = 0; /* 1 = send, 2 = receive */ 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], "\-t option must be greater than 0\[rs]n"); break; case \[aq]k\[aq]: msgkey = atoi(optarg); break; default: usage(argv[0], "Unrecognized option\[rs]n"); } } \& if (mode == 0) usage(argv[0], "must use either \-s or \-r option\[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 Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Rafał Lewczuk , Andrzej Krzysztofowicz , Robert Luberda i Michał Kułach . .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 .