| mq_notify(3) | Library Functions Manual | mq_notify(3) |
mq_notify - înregistrare pentru notificare atunci când un mesaj este disponibil
Biblioteca de timp real (librt, -lrt)
#include <mqueue.h> #include <signal.h> /* Definiția constantelor SIGEV_* */
int mq_notify(mqd_t mqdes, const struct sigevent *sevp);
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:
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ă).
În caz de succes, mq_notify() returnează 0; în caz de eroare, se returnează -1, cu errno configurată pentru a indica eroarea.
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.
Pentru o explicație a termenilor folosiți în această secțiune, a se vedea attributes(7).
| Interfață | Atribut | Valoare |
| mq_notify() | Siguranța firelor | MT-Safe |
Î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.
POSIX.1-2008.
POSIX.1-2001.
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.
#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 */ }
mq_close(3), mq_getattr(3), mq_open(3), mq_receive(3), mq_send(3), mq_unlink(3), mq_overview(7), sigevent(3type)
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.
| 15 iunie 2024 | Pagini de manual de Linux 6.9.1 |