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_MQUEUEMQ anlegen wenn noch nicht vorhanden:
mkdir /dev/mqueue && mount -t mqueue none /dev/mqueue && chmod 775 /dev/mqueue && chown root:wheel /dev/mqueueProgramm mit -lrt kompilieren (Realtime Irgendwas, wird von POSIX MQ benoetigt
#includeNuetzliche Links dazu://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); }
gcc -lrt -c posix_mq.cProjekt 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-pathHow to use an external object file with gcc:
gcc -lrt -c posix_mq.c # Creates posix_mq.oCompile main program:
gcc -c -lrt Px.c # -c Only compile and assemble, but don't bind