.\" -*- coding: UTF-8 -*-
'\" t
.\" Copyright (C) 2006 Michael Kerrisk <mtk.manpages@gmail.com>
.\"
.\" SPDX-License-Identifier: Linux-man-pages-copyleft
.\"
.\"*******************************************************************
.\"
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
.TH mq_notify 3 "15 decembrie 2022" "Pagini de manual de Linux 6.03" 
.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 <mqueue.h>\fP
\fB#include <signal.h>           \fP/* Definiția constantelor SIGEV_* */
.PP
\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.
.PP
Argumentul \fIsevp\fP este un indicator către o structură \fIsigevent\fP. Pentru
definiția și detaliile generale ale acestei structuri, consultați
\fBsigevent\fP(7).
.PP
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(7) pentru detalii generale.  Câmpul \fIsi_code\fP din
structura \fIsiginfo_t\fP va fi definit la \fBSI_MESGQ\fP. În plus, \fIsi_pid\fP va
fi setat la PID\-ul procesului care a trimis mesajul, iar \fIsi_uid\fP va fi
stabilit 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(7)
pentru detalii.
.PP
Un singur proces poate fi înregistrat pentru a primi notificări de la o
coadă de mesaje.
.PP
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ă.
.PP
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.
.PP
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.
.PP
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ă.
.PP
.\" 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).
.ad l
.nh
.TS
allbox;
lbx lb lb
l l l.
Interfață	Atribut	Valoare
T{
\fBmq_notify\fP()
T}	Siguranța firelor	MT\-Safe
.TE
.hy
.ad
.sp 1
.SH STANDARDE
POSIX.1\-2001.
.SH NOTE
.\"
.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 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 <mqueue.h>
#include <pthread.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define handle_error(msg) \e
    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\en", 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>\en", 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;   /* Argumente 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(7)
.PP
.SH TRADUCERE
Traducerea în limba română a acestui manual a fost făcută de
Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>
.
.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 .