msgget(2)

NUME
msgget - obține un identificator de coadă de mesaje System V

BIBLIOTECA
Biblioteca C standard (libc, -lc)

SINOPSIS
#include <sys/msg.h>

int msgget(key_t key, int msgflg);

DESCRIERE
Apelul de sistem msgget() returnează identificatorul cozii de mesaje System V asociat cu valoarea argumentului key. Acesta poate fi utilizat fie pentru a obține identificatorul unei cozi de mesaje create anterior (atunci când msgflg este zero și key nu are valoarea IPC_PRIVATE), fie pentru a crea un set nou.

O nouă coadă de mesaje este creată dacă key are valoarea IPC_PRIVATE sau dacă key nu este IPC_PRIVATE, dacă nu există o coadă de mesaje cu cheia key dată și dacă IPC_CREAT este specificat în msgflg.

Dacă msgflg specifică atât IPC_CREAT, cât și IPC_EXCL și există deja o coadă de mesaje pentru key, atunci msgget() eșuează cu errno configurată la EEXIST; (acest lucru este analog cu efectul combinației O_CREAT | O_EXCL pentru open(2)).

La creare, cei mai puțin semnificativi biți ai argumentului msgflg definesc permisiunile cozii de mesaje. Acești biți de permisiune au același format și semantică ca și permisiunile specificate pentru argumentul mode din open(2); (permisiunile de execuție nu sunt utilizate).

Dacă este creată o nouă coadă de mesaje, atunci structura de date asociată msqid_ds (a se vedea msgctl(2)) este inițializată după cum urmează:

•   msg_perm.cuid și msg_perm.uid sunt stabilite la ID-ul de utilizator efectiv al procesului de apelare.

•   msg_perm.cgid și msg_perm.gid sunt stabilite la ID-ul de grup efectiv al procesului apelant.

•   Cei mai puțin semnificativi 9 biți din msg_perm.mode sunt stabiliți la cei mai puțin semnificativi 9 biți din msgflg.

•   msg_qnum, msg_lspid, msg_lrpid, msg_stime, și msg_rtime sunt stabilite la 0.

•   msg_ctime este stabilit la ora curentă.

•   msg_qbytes este stabilit la limita sistemului MSGMNB.

În cazul în care coada de mesaje există deja, se verifică permisiunile și se verifică dacă aceasta este marcată pentru distrugere.

VALOAREA RETURNATĂ
În caz de succes, msgget() returnează identificatorul cozii de așteptare a mesajelor (un număr întreg nenegativ). În caz de eșec, se returnează -1, iar errno este configurată pentru a indica eroarea.

ERORI-IEȘIRE

EACCES
    Există o coadă de mesaje pentru key, dar procesul apelant nu are permisiunea de a accesa coada de așteptare și nu are capacitatea CAP_IPC_OWNER în spațiul de nume al utilizatorului care guvernează spațiul de nume IPC.

EEXIST
    IPC_CREAT și IPC_EXCL au fost specificate în msgflg, dar există deja o coadă de mesaje pentru key.

ENOENT
    Nu există o coadă de mesaje pentru key și msgflg nu a specificat IPC_CREAT.

ENOMEM
    Trebuie creată o coadă de mesaje, dar sistemul nu are suficientă memorie pentru noua structură de date.

ENOSPC
    Trebuie creată o coadă de mesaje, dar limita sistemului pentru numărul maxim de cozi de mesaje (MSGMNI) ar fi depășită.

STANDARDE
POSIX.1-2024 XSI.

ISTORIC
SVr4, SUSv1, POSIX.1-2001 XSI.

  Linux
Până la Linux 2.3.20, Linux ar fi returnat EIDRM pentru un msgget() pe o coadă de mesaje programată pentru ștergere.

NOTE
IPC_PRIVATE nu este un câmp fanion, ci un tip key_t. În cazul în care se utilizează această valoare specială pentru key, apelul de sistem ignoră totul, cu excepția celor mai puțin semnificativi 9 biți din msgflg și creează o nouă coadă de mesaje (în caz de succes).

Următoarea este o limită de sistem privind resursele de coadă de mesaje care afectează un apel msgget():

MSGMNI
    Limita la nivel de sistem a numărului de cozi de mesaje. Înainte de Linux 3.19, valoarea implicită pentru această limită era calculată cu ajutorul unei formule bazate pe memoria disponibilă a sistemului. Începând cu Linux 3.19, valoarea implicită este de 32.000. În Linux, această limită poate fi citită și modificată prin intermediul /proc/sys/kernel/msgmni.

ERORI
Alegerea denumirii IPC_PRIVATE a fost poate o alegere greșită, IPC_NEW ar fi arătat mai clar funcția sa.

CONSULTAȚI ȘI
msgctl(2), msgrcv(2), msgsnd(2), ftok(3), capabilities(7), mq_overview(7), sysvipc(7)

TRADUCERE
Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>

Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 (https://www.gnu.org/licenses/gpl-3.0.html) sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.

Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.