mq_notify(3) Library Functions Manual mq_notify(3) NUME mq_notify - inregistrare pentru notificare atunci cand un mesaj este disponibil BIBLIOTECA Biblioteca de timp real (librt, -lrt) SINOPSIS #include #include /* Definiia constantelor SIGEV_* */ int mq_notify(mqd_t mqdes, const struct sigevent *sevp); DESCRIERE mq_notify() permite procesului apelant sa se inregistreze sau sa-i anuleze inregistarea pentru a primi o notificare asincrona atunci cand un mesaj nou sosete in coada de mesaje goala la care se face referire in descriptorul cozii de mesaje mqdes. Argumentul sevp este un indicator catre o structura sigevent. Pentru definiia i detaliile generale ale acestei structuri, a se vedea sigevent(3type). Daca sevp este un indicator nenul, atunci mq_notify() inregistreaza procesul apelant pentru a primi notificarea mesajului. Campul sigev_notify din structura sigevent catre care indica sevp specifica modul in care trebuie efectuata notificarea. Acest camp are una dintre urmatoarele valori: SIGEV_NONE O notificare ,,nula": procesul apelant este inregistrat ca inta pentru notificare, dar atunci cand sosete un mesaj, nu este trimisa nicio notificare. SIGEV_SIGNAL Notifica procesul prin trimiterea semnalului specificat in sigev_signo. A se vedea sigevent(3type) pentru detalii generale. Campul si_code din structura siginfo_t va fi stabilit la SI_MESGQ. In 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 invoca sigev_notify_function ca i cum ar fi funcia de pornire a unui nou fir de execuie. Consultai sigevent(3type) pentru detalii. Un singur proces poate fi inregistrat pentru a primi notificari de la o coada de mesaje. Daca sevp este NULL, iar procesul apelant este inregistrat in prezent pentru a primi notificari pentru aceasta coada de mesaje, atunci inregistrarea este eliminata; un alt proces se poate inregistra apoi pentru a primi o notificare de mesaj pentru aceasta coada. Notificarea mesajelor are loc numai atunci cand sosete un mesaj nou i coada a fost golita anterior. Daca coada nu era goala in momentul apelarii mq_notify(), atunci o notificare va avea loc numai dupa ce coada este golita i sosete un mesaj nou. Daca un alt proces sau fir de execuie ateapta sa citeasca un mesaj dintr-o coada goala folosind mq_receive(3), atunci orice inregistrare de notificare a mesajului este ignorata: mesajul este livrat procesului sau firului de execuie care apeleaza mq_receive(3), iar inregistrarea de notificare a mesajului ramane in vigoare. Notificarea are loc o singura data: dupa livrarea unei notificari, inregistrarea notificarii este eliminata, iar un alt proces se poate inregistra pentru notificarea mesajului. Daca procesul notificat dorete sa primeasca urmatoarea notificare, acesta poate utiliza mq_notify() pentru a solicita o noua notificare. Acest lucru trebuie facut inainte de golirea tuturor mesajelor necitite din coada; (pasarea cozii in modul de ne-blocare este utila pentru golirea cozii de mesaje fara blocare odata ce aceasta este goala). VALOAREA RETURNATA In caz de succes, mq_notify() returneaza 0; in caz de eroare, se returneaza -1, cu errno configurata pentru a indica eroarea. ERORI-IEIRE EBADF Descriptorul de coada de mesaje specificat in mqdes nu este valid. EBUSY Un alt proces s-a inregistrat deja pentru a primi notificare pentru aceasta coada 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 numar de semnal valid. ENOMEM Memorie insuficienta. POSIX.1-2008 spune ca o implementare poate genera o eroare EINVAL daca sevp este NULL, iar apelantul nu este inregistrat in prezent pentru a primi notificari pentru coada mqdes. ATRIBUTE Pentru o explicaie a termenilor folosii in aceasta seciune, a se vedea attributes(7). +--------------------------------------+---------------------+---------+ |Interfaa | Atribut | Valoare | +--------------------------------------+---------------------+---------+ |mq_notify() | Sigurana firelor | MT-Safe | +--------------------------------------+---------------------+---------+ VERSIUNI Diferene intre biblioteca C i nucleu In implementarea glibc, funcia de biblioteca mq_notify() este implementata peste apelul de sistem cu acelai nume. Atunci cand sevp este NULL sau specifica un alt mecanism de notificare decat SIGEV_THREAD, funcia de biblioteca invoca direct apelul sistemului. Pentru SIGEV_THREAD, o mare parte din implementare se afla in biblioteca, i nu in nucleu; (acest lucru este necesar, deoarece firul implicat in gestionarea notificarii este unul care trebuie gestionat de implementarea firelor POSIX din biblioteca C). Implementarea implica utilizarea unui soclu netlink(7) brut i creeaza un nou fir pentru fiecare notificare care este transmisa procesului. STANDARDE POSIX.1-2008. ISTORIC POSIX.1-2001. EXEMPLE Urmatorul program inregistreaza o cerere de notificare pentru coada de mesaje numita in argumentul sau din linia de comanda. Notificarea este efectuata prin crearea unui fir de execuie. Firul executa o funcie care citete un mesaj din coada i apoi termina procesul. Sursa programului #include #include #include #include #include #include #define handle_error(msg) \ do { perror(msg); exit(EXIT_FAILURE); } while (0) static void /* Firul pornete funcia */ tfunc(union sigval sv) { struct mq_attr attr; ssize_t nr; void *buf; mqd_t mqdes = *((mqd_t *) sv.sival_ptr); /* Determina dimensiunea maxima a mesajului; aloca 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("Citii %zd octei 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 \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 funcia firului */ if (mq_notify(mqdes, &sev) == -1) handle_error("mq_notify"); pause(); /* Procesul va fi finalizat de funcia firului */ } CONSULTAI 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 in limba romana a acestui manual a fost facuta de Remus- Gabriel Chelu Aceasta traducere este documentaie gratuita; citii Licena publica generala GNU Versiunea 3 sau o versiune ulterioara cu privire la condiii privind drepturile de autor. NU se asuma NICIO RESPONSABILITATE. Daca gasii erori in traducerea acestui manual, va rugam sa trimitei un e-mail la . Pagini de manual de Linux 6.12 23 iulie 2024 mq_notify(3)