Provided by: manpages-ro-dev_4.27.0-1_all bug

NUME

       mq_notify - înregistrare pentru notificare atunci când un mesaj este disponibil

BIBLIOTECA

       Biblioteca de timp real (librt, -lrt)

SINOPSIS

       #include <mqueue.h>
       #include <signal.h>           /* Definiția constantelor SIGEV_* */

       int mq_notify(mqd_t mqdes, const struct sigevent *sevp);

DESCRIERE

       mq_notify() 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 mqdes.

       Argumentul sevp este un indicator către o structură sigevent. Pentru definiția și detaliile generale  ale
       acestei structuri, a se vedea sigevent(3type).

       Dacă  sevp  este  un  indicator  nenul,  atunci mq_notify() înregistrează procesul apelant pentru a primi
       notificarea mesajului. Câmpul sigev_notify din structura sigevent către care indică sevp specifică  modul
       în care trebuie efectuată notificarea. Acest câmp are una dintre următoarele valori:

       SIGEV_NONE
              O notificare „nulă”: procesul apelant este înregistrat ca țintă pentru notificare, dar atunci când
              sosește un mesaj, nu este trimisă nicio notificare.

       SIGEV_SIGNAL
              Notifică procesul prin trimiterea semnalului specificat în sigev_signo. A se vedea sigevent(3type)
              pentru  detalii  generale.  Câmpul  si_code din structura siginfo_t va fi stabilit la SI_MESGQ. În
              plus, si_pid va fi definit la PID-ul procesului care a trimis mesajul, iar si_uid va fi definit la
              ID-ul utilizatorului real al procesului de trimitere.

       SIGEV_THREAD
              La livrarea mesajului, se invocă sigev_notify_function ca și cum ar fi funcția de pornire  a  unui
              nou fir de execuție. Consultați sigevent(3type) pentru detalii.

       Un singur proces poate fi înregistrat pentru a primi notificări de la o coadă de mesaje.

       Dacă  sevp  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ă.

       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 mq_notify(), atunci o notificare va avea loc numai  după  ce
       coada este golită și sosește un mesaj nou.

       Dacă  un  alt  proces  sau  fir  de  execuție  așteaptă să citească un mesaj dintr-o coadă goală folosind
       mq_receive(3), atunci orice înregistrare de notificare a mesajului este  ignorată:  mesajul  este  livrat
       procesului  sau  firului  de  execuție  care  apelează  mq_receive(3),  iar înregistrarea de notificare a
       mesajului rămâne în vigoare.

       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 mq_notify() 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ă).

VALOAREA RETURNATĂ

       În caz de succes, mq_notify() returnează 0; în caz de eroare, se  returnează  -1,  cu  errno  configurată
       pentru a indica eroarea.

ERORI-IEȘIRE

       EBADF  Descriptorul de coadă de mesaje specificat în mqdes nu este valid.

       EBUSY  Un alt proces s-a înregistrat deja pentru a primi notificare pentru această coadă de mesaje.

       EINVAL sevp->sigev_notify  nu  este una dintre valorile permise; sau sevp->sigev_notify este SIGEV_SIGNAL
              și sevp->sigev_signo nu este un număr de semnal valid.

       ENOMEM Memorie insuficientă.

       POSIX.1-2008 spune că o implementare poate genera o eroare EINVAL dacă sevp este NULL, iar  apelantul  nu
       este înregistrat în prezent pentru a primi notificări pentru coada mqdes.

ATRIBUTE

       Pentru o explicație a termenilor folosiți în această secțiune, a se vedea attributes(7).
       ┌─────────────────────────────────────────────────────────────────────────┬───────────────────┬─────────┐
       │ InterfațăAtributValoare │
       ├─────────────────────────────────────────────────────────────────────────┼───────────────────┼─────────┤
       │ mq_notify()                                                             │ Siguranța firelor │ MT-Safe │
       └─────────────────────────────────────────────────────────────────────────┴───────────────────┴─────────┘

VERSIUNI

   Diferențe între biblioteca C și nucleu
       În  implementarea  glibc,  funcția  de bibliotecă mq_notify() este implementată peste apelul de sistem cu
       același nume. Atunci când sevp este NULL sau specifică un alt mecanism de notificare decât  SIGEV_THREAD,
       funcția de bibliotecă invocă direct apelul sistemului. Pentru SIGEV_THREAD, 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  netlink(7)  brut  și  creează  un  nou  fir  pentru  fiecare
       notificare care este transmisă procesului.

STANDARDE

       POSIX.1-2008.

ISTORIC

       POSIX.1-2001.

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.

   Sursa programului
       #include <mqueue.h>
       #include <pthread.h>
       #include <signal.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <unistd.h>

       #define handle_error(msg) \
           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\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 <mq-name>\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 */
       }

CONSULTAȚI ȘI

       mq_close(3),   mq_getattr(3),   mq_open(3),   mq_receive(3),  mq_send(3),  mq_unlink(3),  mq_overview(7),
       sigevent(3type)

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 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.

Pagini de manual de Linux 6.9.1                   15 iunie 2024                                     mq_notify(3)