<-- Studium  

Systemsoftware

Aufgabenstellung
Beispielprogramm: Einen String in eine POSIX Message Queue schreiben:
Messagequeus sind wie ein Eimer, mq_send tut eine Nachricht rein und mq_recieve holt sie wieder raus.
Rausfinden ob der Kernel POSIX MQ unterstuetzt:

cat /usr/src/linux-2.6.24-ARCH/.config | grep CONFIG_POSIX_MQUEUE
MQ anlegen wenn noch nicht vorhanden:
mkdir /dev/mqueue &&
mount -t mqueue none /dev/mqueue &&
chmod 775 /dev/mqueue &&
chown root:wheel /dev/mqueue
Programm mit -lrt kompilieren (Realtime Irgendwas, wird von POSIX MQ benoetigt
#include   //printf() und co.
#include  //POSIX message queues
#include   //Zum Auswerten der POSIX Fehler
#include  //Fuer strerror() um den Klartext zu einer Fehlernummer zu 
//bekommen

extern int errno; //Hier schreibt die POSIX API die Nummern der Fehler rein 
//die z.B. bei mq_open auftreten koennen

int main(int argc, char** argv) {
    mqd_t id;
    char rueckgabe[70];
    unsigned int sender;

    struct mq_attr attr, rueckgabeTest;
    attr.mq_maxmsg = 10; //Wieviele Nachrichten maximal in die Queue können
    attr.mq_msgsize = 70; //Maximale Groesse einer Nachricht
    attr.mq_flags = 0;

    id = mq_open("/test", O_RDWR | O_CREAT, 0777, &attr);

    printf("Meldung mq_open: %s\nid der Messageque: %d\n\n", strerror(errno), id);
    errno = 0;

    mq_getattr(id, &rueckgabeTest);

    printf("Meldung mq_getattr: %s \n"
            "mq_curmsgs: %d\n"
            "mq_flags: %s\n"
            "mq_maxmsg: %d\n"
            "mq_msgsize: %d\n\n", strerror(errno), rueckgabeTest.mq_curmsgs,
            rueckgabeTest.mq_flags, rueckgabeTest.mq_maxmsg,
            rueckgabeTest.mq_msgsize);

    errno = 0;

    //strcat(msgcontent, "Jetzt aber muh!");

    //von mq_open zurückgegebene Nummer der MQ, Nachricht, Laenge der
    //Nachricht, NULL=?
    mq_send(id, "Nachricht 1 muahaha", 70, 1);
    printf("Meldung mq_send: %s\n\n", strerror(errno));

    int recRet = 0;
    recRet = mq_receive(id, rueckgabe, 70, NULL);
    printf("Nachricht mq_receive: %s, Laenge %d\n", rueckgabe, recRet);

    return (0);
}

Nuetzliche Links dazu:
1
2
3
 
Objektdatei erzeugen:
gcc -lrt -c posix_mq.c
Projekt kompilieren:
# For Posix Mesage Queue:
gcc -v -g -lrt -o Px -I POSIX_MQ/ Px.c POSIX_MQ/posix_mq.c

# For Shared Memory:
gcc -v -g -lrt -o Px -I SHM/ Px.c SHM/shm.c
#
# -v   Verbose
# -g   Build with debug information, also displays error line numbers in decimal
# -lrt Real time library, needed for message queues
# -o   Name of the binary to create
# -I   Add to Include-path

How to use an external object file with gcc:
 
Compile code for object file:
gcc -lrt -c posix_mq.c
# Creates posix_mq.o
Compile main program:
gcc -c -lrt Px.c
# -c Only compile and assemble, but don't bind