mq_getattr(3)

NUME
mq_getattr, mq_setattr - obține/stabilește atributele cozii de mesaje

BIBLIOTECA
Biblioteca de timp real (librt, -lrt)

SINOPSIS
#include <mqueue.h>

int mq_getattr(mqd_t mqdes, struct mq_attr *attr);
int mq_setattr(mqd_t mqdes, const struct mq_attr *restrict newattr,
               struct mq_attr *restrict oldattr);

DESCRIERE
mq_getattr() și mq_setattr() extrag și, respectiv, modifică atributele cozii de așteptare a mesajelor la care se face referire prin descriptorul cozii de așteptare a mesajelor mqdes.

mq_getattr() returnează o structură mq_attr în memoria tampon indicată de attr. Această structură se definește astfel:

    struct mq_attr {
        long mq_flags;       /* Fanioane: 0 sau O_NONBLOCK */
        long mq_maxmsg;      /* Numărul maxim de mesaje în coadă */
        long mq_msgsize;     /* Dimensiunea maximă a mesajului (octeți)) */
        long mq_curmsgs;     /* Numărul de mesaje aflate în prezent în coadă */
    };

Câmpul mq_flags conține fanioanele asociate cu descrierea cozii de mesaje deschise. Acest câmp este inițializat atunci când coada este creată de mq_open(3). Singurul fanion care poate apărea în acest câmp este O_NONBLOCK.

Câmpurile mq_maxmsg și mq_msgsize sunt stabilite atunci când coada de mesaje este creată de mq_open(3). Câmpul mq_maxmsg reprezintă o limită superioară a numărului de mesaje care pot fi plasate în coada de așteptare cu ajutorul mq_send(3). Câmpul mq_msgsize este o limită superioară a dimensiunii mesajelor care pot fi plasate în coada de așteptare. Ambele câmpuri trebuie să aibă o valoare mai mare decât zero. Două fișiere /proc care impun plafoane pentru valorile acestor câmpuri sunt descrise în mq_overview(7).

Câmpul mq_curmsgs returnează numărul de mesaje aflate în prezent în coada de așteptare.

mq_setattr() stabilește atributele cozii de mesaje utilizând informațiile furnizate în structura mq_attr indicată de newattr. Singurul atribut care poate fi modificat este stabilirea fanionului O_NONBLOCK din mq_flags. Celelalte câmpuri din newattr sunt ignorate. În cazul în care câmpul oldattr nu este NULL, atunci memoria tampon la care indică este utilizată pentru a returna o structură mq_attr care conține aceleași informații ca cele returnate de mq_getattr().

VALOAREA RETURNATĂ
În caz de succes, mq_getattr() și mq_setattr() 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.

EINVAL
    newattr->mq_flags conținea alți biți activați decât O_NONBLOCK.

ATRIBUTE
Pentru o explicație a termenilor folosiți în această secțiune, a se vedea attributes(7).
Interfață | Atribut | Valoare
mq_getattr(), mq_setattr() | Siguranța firelor | MT-Safe

VERSIUNI
În Linux, mq_getattr() și mq_setattr() sunt funcții de bibliotecă suprapuse peste apelul de sistem mq_getsetattr(2).

STANDARDE
POSIX.1-2008.

ISTORIC
POSIX.1-2001.

EXEMPLE
Programul de mai jos poate fi utilizat pentru a arăta valorile implicite mq_maxmsg și mq_msgsize care sunt atribuite unei cozi de așteptare a mesajelor care este creată cu un apel la mq_open(3) în care argumentul attr este NULL. Iată un exemplu de execuție a programului:

    $ ./a.out /testq;
    Numărul maxim de mesaje din coada de așteptare:   10
    Dimensiunea maximă a mesajului:                   8192

Începând cu Linux 3.5, următoarele fișiere /proc (descrise în mq_overview(7)) pot fi utilizate pentru a controla valorile implicite:

    $ uname -sr;
    Linux 3.8.0
    $ cat /proc/sys/fs/mqueue/msg_default;
    10
    $ cat /proc/sys/fs/mqueue/msgsize_default;
    8192

  Sursa programului
    #include <err.h>
    #include <fcntl.h>
    #include <mqueue.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/stat.h>
    #include <unistd.h>

    #define errExit(msg)    do { perror(msg); exit(EXIT_FAILURE); \
                            } while (0)

    int
    main(int argc, char *argv[])
    {
        mqd_t mqd;
        struct mq_attr attr;

        if (argc != 2) {
            fprintf(stderr, "Utilizare: %s mq-name\n", argv[0]);
            exit(EXIT_FAILURE);
        }

        mqd = mq_open(argv[1], O_CREAT | O_EXCL, 0600, NULL);
        if (mqd == (mqd_t) -1)
            err(EXIT_FAILURE, "mq_open");

        if (mq_getattr(mqd, &attr) == -1)
            err(EXIT_FAILURE, "mq_getattr");

        printf("Numărul maxim de mesaje din coada de așteptare:   %ld\n", attr.mq_maxmsg);
        printf("Dimensiunea maximă a mesajului:                   %ld\n", attr.mq_msgsize);

        if (mq_unlink(argv[1]) == -1)
            err(EXIT_FAILURE, "mq_unlink");

        exit(EXIT_SUCCESS);
    }

CONSULTAȚI ȘI
mq_close(3), mq_notify(3), mq_open(3), mq_receive(3), mq_send(3), mq_unlink(3), mq_overview(7)

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 (https://www.gnu.org/licenses/gpl-3.0.html) 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.