.\" -*- coding: UTF-8 -*- '\" t .\" Copyright (C) 2006 Michael Kerrisk .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH mq_notify 3 "23 iulie 2024" "Pagini de manual de Linux 6.12" .SH NUME mq_notify \- înregistrare pentru notificare atunci când un mesaj este disponibil .SH BIBLIOTECA Biblioteca de timp real (\fIlibrt\fP, \fI\-lrt\fP) .SH SINOPSIS .nf \fB#include \fP \fB#include \fP/* Definiția constantelor SIGEV_* */ .P \fBint mq_notify(mqd_t \fP\fImqdes\fP\fB, const struct sigevent *\fP\fIsevp\fP\fB);\fP .fi .SH DESCRIERE \fBmq_notify\fP() permite procesului apelant să se înregistreze sau să\-și anuleze înregistarea pentru a primi o notificare asincronă atunci când un mesaj nou sosește în coada de mesaje goală la care se face referire în descriptorul cozii de mesaje \fImqdes\fP. .P Argumentul \fIsevp\fP este un indicator către o structură \fIsigevent\fP. Pentru definiția și detaliile generale ale acestei structuri, a se vedea \fBsigevent\fP(3type). .P Dacă \fIsevp\fP este un indicator nenul, atunci \fBmq_notify\fP() înregistrează procesul apelant pentru a primi notificarea mesajului. Câmpul \fIsigev_notify\fP din structura \fIsigevent\fP către care indică \fIsevp\fP specifică modul în care trebuie efectuată notificarea. Acest câmp are una dintre următoarele valori: .TP \fBSIGEV_NONE\fP .\" When is SIGEV_NONE useful? O notificare „nulă”: procesul apelant este înregistrat ca țintă pentru notificare, dar atunci când sosește un mesaj, nu este trimisă nicio notificare. .TP \fBSIGEV_SIGNAL\fP .\" I don't know of other implementations that set .\" si_pid and si_uid -- MTK Notifică procesul prin trimiterea semnalului specificat în \fIsigev_signo\fP. A se vedea \fBsigevent\fP(3type) pentru detalii generale. Câmpul \fIsi_code\fP din structura \fIsiginfo_t\fP va fi stabilit la \fBSI_MESGQ\fP. În plus, \fIsi_pid\fP va fi definit la PID\-ul procesului care a trimis mesajul, iar \fIsi_uid\fP va fi definit la ID\-ul utilizatorului real al procesului de trimitere. .TP \fBSIGEV_THREAD\fP La livrarea mesajului, se invocă \fIsigev_notify_function\fP ca și cum ar fi funcția de pornire a unui nou fir de execuție. Consultați \fBsigevent\fP(3type) pentru detalii. .P Un singur proces poate fi înregistrat pentru a primi notificări de la o coadă de mesaje. .P Dacă \fIsevp\fP este NULL, iar procesul apelant este înregistrat în prezent pentru a primi notificări pentru această coadă de mesaje, atunci înregistrarea este eliminată; un alt proces se poate înregistra apoi pentru a primi o notificare de mesaj pentru această coadă. .P Notificarea mesajelor are loc numai atunci când sosește un mesaj nou și coada a fost golită anterior. Dacă coada nu era goală în momentul apelării \fBmq_notify\fP(), atunci o notificare va avea loc numai după ce coada este golită și sosește un mesaj nou. .P Dacă un alt proces sau fir de execuție așteaptă să citească un mesaj dintr\-o coadă goală folosind \fBmq_receive\fP(3), atunci orice înregistrare de notificare a mesajului este ignorată: mesajul este livrat procesului sau firului de execuție care apelează \fBmq_receive\fP(3), iar înregistrarea de notificare a mesajului rămâne în vigoare. .P Notificarea are loc o singură dată: după livrarea unei notificări, înregistrarea notificării este eliminată, iar un alt proces se poate înregistra pentru notificarea mesajului. Dacă procesul notificat dorește să primească următoarea notificare, acesta poate utiliza \fBmq_notify\fP() pentru a solicita o nouă notificare. Acest lucru trebuie făcut înainte de golirea tuturor mesajelor necitite din coadă; (pasarea cozii în modul de ne\-blocare este utilă pentru golirea cozii de mesaje fără blocare odată ce aceasta este goală). .SH "VALOAREA RETURNATĂ" În caz de succes, \fBmq_notify\fP() returnează 0; în caz de eroare, se returnează \-1, cu \fIerrno\fP configurată pentru a indica eroarea. .SH ERORI\-IEȘIRE .TP \fBEBADF\fP Descriptorul de coadă de mesaje specificat în \fImqdes\fP nu este valid. .TP \fBEBUSY\fP Un alt proces s\-a înregistrat deja pentru a primi notificare pentru această coadă de mesaje. .TP \fBEINVAL\fP \fIsevp\->sigev_notify\fP nu este una dintre valorile permise; sau \fIsevp\->sigev_notify\fP este \fBSIGEV_SIGNAL\fP și \fIsevp\->sigev_signo\fP nu este un număr de semnal valid. .TP \fBENOMEM\fP Memorie insuficientă. .P .\" Linux does not do this POSIX.1\-2008 spune că o implementare \fIpoate\fP genera o eroare \fBEINVAL\fP dacă \fIsevp\fP este NULL, iar apelantul nu este înregistrat în prezent pentru a primi notificări pentru coada \fImqdes\fP. .SH ATRIBUTE Pentru o explicație a termenilor folosiți în această secțiune, a se vedea \fBattributes\fP(7). .TS allbox; lbx lb lb l l l. Interfață Atribut Valoare T{ .na .nh \fBmq_notify\fP() T} Siguranța firelor MT\-Safe .TE .SH VERSIUNI .SS "Diferențe între biblioteca C și nucleu" În implementarea glibc, funcția de bibliotecă \fBmq_notify\fP() este implementată peste apelul de sistem cu același nume. Atunci când \fIsevp\fP este NULL sau specifică un alt mecanism de notificare decât \fBSIGEV_THREAD\fP, funcția de bibliotecă invocă direct apelul sistemului. Pentru \fBSIGEV_THREAD\fP, o mare parte din implementare se află în bibliotecă, și nu în nucleu; (acest lucru este necesar, deoarece firul implicat în gestionarea notificării este unul care trebuie gestionat de implementarea firelor POSIX din biblioteca C). Implementarea implică utilizarea unui soclu \fBnetlink\fP(7) brut și creează un nou fir pentru fiecare notificare care este transmisă procesului. .SH STANDARDE POSIX.1\-2008. .SH ISTORIC POSIX.1\-2001. .SH EXEMPLE Următorul program înregistrează o cerere de notificare pentru coada de mesaje numită în argumentul său din linia de comandă. Notificarea este efectuată prin crearea unui fir de execuție. Firul execută o funcție care citește un mesaj din coadă și apoi termină procesul. .SS "Sursa programului" .\" SRC BEGIN (mq_notify.c) .EX #include #include #include #include #include #include \& #define handle_error(msg) \[rs] do { perror(msg); exit(EXIT_FAILURE); } while (0) \& static void /* Firul pornește funcția */ tfunc(union sigval sv) { struct mq_attr attr; ssize_t nr; void *buf; mqd_t mqdes = *((mqd_t *) sv.sival_ptr); \& /* Determină dimensiunea maximă a mesajului; alocă memorie tampon pentru primirea mesajului */ \& if (mq_getattr(mqdes, &attr) == \-1) handle_error("mq_getattr"); buf = malloc(attr.mq_msgsize); if (buf == NULL) handle_error("malloc"); \& nr = mq_receive(mqdes, buf, attr.mq_msgsize, NULL); if (nr == \-1) handle_error("mq_receive"); \& printf("Citiți %zd octeți din MQ\[rs]n", nr); free(buf); exit(EXIT_SUCCESS); /* Terminarea procesului */ } \& int main(int argc, char *argv[]) { mqd_t mqdes; struct sigevent sev; \& if (argc != 2) { fprintf(stderr, "Utilizare: %s \[rs]n", argv[0]); exit(EXIT_FAILURE); } \& mqdes = mq_open(argv[1], O_RDONLY); if (mqdes == (mqd_t) \-1) handle_error("mq_open"); \& sev.sigev_notify = SIGEV_THREAD; sev.sigev_notify_function = tfunc; sev.sigev_notify_attributes = NULL; sev.sigev_value.sival_ptr = &mqdes; /* Argument pentru funcția firului */ if (mq_notify(mqdes, &sev) == \-1) handle_error("mq_notify"); \& pause(); /* Procesul va fi finalizat de funcția firului */ } .EE .\" SRC END .SH "CONSULTAȚI ȘI" \fBmq_close\fP(3), \fBmq_getattr\fP(3), \fBmq_open\fP(3), \fBmq_receive\fP(3), \fBmq_send\fP(3), \fBmq_unlink\fP(3), \fBmq_overview\fP(7), \fBsigevent\fP(3type) .PP .SH TRADUCERE Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu . .PP Această traducere este documentație gratuită; citiți .UR https://www.gnu.org/licenses/gpl-3.0.html Licența publică generală GNU Versiunea 3 .UE sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE. .PP Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la .MT translation-team-ro@lists.sourceforge.net .ME .