1.1 --- a/c++/POSIXoveFronty/Fronta/Fronta.pro Sun Apr 05 22:02:15 2009 +0200
1.2 +++ b/c++/POSIXoveFronty/Fronta/Fronta.pro Tue Apr 07 01:16:04 2009 +0200
1.3 @@ -1,12 +1,12 @@
1.4 ######################################################################
1.5 -# Automatically generated by qmake (2.01a) p dub 3 18:45:01 2009
1.6 +# Automatically generated by qmake (2.01a) ne dub 5 22:16:46 2009
1.7 ######################################################################
1.8
1.9 TEMPLATE = app
1.10 TARGET =
1.11 -DEPENDPATH += .
1.12 +DEPENDPATH += . qtc-gdbmacros
1.13 INCLUDEPATH += .
1.14
1.15 # Input
1.16 -HEADERS += program.h
1.17 -SOURCES += program.cpp
1.18 +HEADERS += fronta.h program.h
1.19 +SOURCES += fronta.cpp program.cpp qtc-gdbmacros/gdbmacros.cpp
2.1 --- a/c++/POSIXoveFronty/Fronta/Makefile Sun Apr 05 22:02:15 2009 +0200
2.2 +++ b/c++/POSIXoveFronty/Fronta/Makefile Tue Apr 07 01:16:04 2009 +0200
2.3 @@ -1,9 +1,9 @@
2.4 #############################################################################
2.5 # Makefile for building: Fronta
2.6 -# Generated by qmake (2.01a) (Qt 4.4.3) on: so dub 4 22:38:33 2009
2.7 +# Generated by qmake (2.01a) (Qt 4.4.3) on: ne dub 5 22:16:48 2009
2.8 # Project: Fronta.pro
2.9 # Template: app
2.10 -# Command: /usr/bin/qmake-qt4 -spec /usr/share/qt4/mkspecs/linux-g++ -unix -o Makefile Fronta.pro
2.11 +# Command: /usr/bin/qmake -unix -o Makefile Fronta.pro
2.12 #############################################################################
2.13
2.14 ####### Compiler, tools and options
2.15 @@ -19,7 +19,7 @@
2.16 LIBS = $(SUBLIBS) -L/usr/lib -lQtGui -lQtCore -lpthread
2.17 AR = ar cqs
2.18 RANLIB =
2.19 -QMAKE = /usr/bin/qmake-qt4
2.20 +QMAKE = /usr/bin/qmake
2.21 TAR = tar -cf
2.22 COMPRESS = gzip -9f
2.23 COPY = cp -f
2.24 @@ -42,8 +42,12 @@
2.25
2.26 ####### Files
2.27
2.28 -SOURCES = program.cpp
2.29 -OBJECTS = program.o
2.30 +SOURCES = fronta.cpp \
2.31 + program.cpp \
2.32 + qtc-gdbmacros/gdbmacros.cpp
2.33 +OBJECTS = fronta.o \
2.34 + program.o \
2.35 + gdbmacros.o
2.36 DIST = /usr/share/qt4/mkspecs/common/g++.conf \
2.37 /usr/share/qt4/mkspecs/common/unix.conf \
2.38 /usr/share/qt4/mkspecs/common/linux.conf \
2.39 @@ -114,7 +118,7 @@
2.40 /usr/share/qt4/mkspecs/features/lex.prf \
2.41 /usr/lib/libQtGui.prl \
2.42 /usr/lib/libQtCore.prl
2.43 - $(QMAKE) -spec /usr/share/qt4/mkspecs/linux-g++ -unix -o Makefile Fronta.pro
2.44 + $(QMAKE) -unix -o Makefile Fronta.pro
2.45 /usr/share/qt4/mkspecs/common/g++.conf:
2.46 /usr/share/qt4/mkspecs/common/unix.conf:
2.47 /usr/share/qt4/mkspecs/common/linux.conf:
2.48 @@ -136,11 +140,11 @@
2.49 /usr/lib/libQtGui.prl:
2.50 /usr/lib/libQtCore.prl:
2.51 qmake: FORCE
2.52 - @$(QMAKE) -spec /usr/share/qt4/mkspecs/linux-g++ -unix -o Makefile Fronta.pro
2.53 + @$(QMAKE) -unix -o Makefile Fronta.pro
2.54
2.55 dist:
2.56 @$(CHK_DIR_EXISTS) .tmp/Fronta1.0.0 || $(MKDIR) .tmp/Fronta1.0.0
2.57 - $(COPY_FILE) --parents $(SOURCES) $(DIST) .tmp/Fronta1.0.0/ && $(COPY_FILE) --parents program.h .tmp/Fronta1.0.0/ && $(COPY_FILE) --parents program.cpp .tmp/Fronta1.0.0/ && (cd `dirname .tmp/Fronta1.0.0` && $(TAR) Fronta1.0.0.tar Fronta1.0.0 && $(COMPRESS) Fronta1.0.0.tar) && $(MOVE) `dirname .tmp/Fronta1.0.0`/Fronta1.0.0.tar.gz . && $(DEL_FILE) -r .tmp/Fronta1.0.0
2.58 + $(COPY_FILE) --parents $(SOURCES) $(DIST) .tmp/Fronta1.0.0/ && $(COPY_FILE) --parents fronta.h program.h .tmp/Fronta1.0.0/ && $(COPY_FILE) --parents fronta.cpp program.cpp qtc-gdbmacros/gdbmacros.cpp .tmp/Fronta1.0.0/ && (cd `dirname .tmp/Fronta1.0.0` && $(TAR) Fronta1.0.0.tar Fronta1.0.0 && $(COMPRESS) Fronta1.0.0.tar) && $(MOVE) `dirname .tmp/Fronta1.0.0`/Fronta1.0.0.tar.gz . && $(DEL_FILE) -r .tmp/Fronta1.0.0
2.59
2.60
2.61 clean:compiler_clean
2.62 @@ -180,9 +184,15 @@
2.63
2.64 ####### Compile
2.65
2.66 +fronta.o: fronta.cpp fronta.h
2.67 + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o fronta.o fronta.cpp
2.68 +
2.69 program.o: program.cpp program.h
2.70 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o program.o program.cpp
2.71
2.72 +gdbmacros.o: qtc-gdbmacros/gdbmacros.cpp
2.73 + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o gdbmacros.o qtc-gdbmacros/gdbmacros.cpp
2.74 +
2.75 ####### Install
2.76
2.77 install: FORCE
3.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
3.2 +++ b/c++/POSIXoveFronty/Fronta/fronta.cpp Tue Apr 07 01:16:04 2009 +0200
3.3 @@ -0,0 +1,66 @@
3.4 +#include <fronta.h>
3.5 +#include <iostream>
3.6 +
3.7 +using namespace std;
3.8 +
3.9 +Fronta::Fronta() {
3.10 + prijimaci = false;
3.11 + odesilaci = false;
3.12 + otevrena = false;
3.13 +}
3.14 +
3.15 +Fronta::Fronta(char* nazev, bool prijimaci, bool odesilaci) {
3.16 + this->nazev = nazev;
3.17 + this->prijimaci = prijimaci;
3.18 + this->odesilaci = odesilaci;
3.19 +
3.20 + /** Nastavíme vlastnosti fronty */
3.21 + mq_vlastnosti.mq_maxmsg = POCET_ZPRAV_VE_FRONTE;
3.22 + mq_vlastnosti.mq_msgsize = DELKA_ZPRAVY;
3.23 +
3.24 + /** Vytvoříme odesílací (obojetnou) nebo (pouze) čtecí frontu */
3.25 + if (odesilaci) {
3.26 + fronta = mq_open(nazev, O_RDWR | O_CREAT, S_IRWXU | S_IRWXG, &mq_vlastnosti);
3.27 + otevrena = true;
3.28 + } else if (prijimaci) {
3.29 + fronta = mq_open(nazev, O_RDONLY);
3.30 + otevrena = true;
3.31 + } else {
3.32 + otevrena = false;
3.33 + }
3.34 +}
3.35 +
3.36 +int Fronta::odesliZpravu(char* zprava) {
3.37 + if (otevrena && odesilaci) {
3.38 + return mq_send(fronta, zprava, strlen(zprava) + 1, 0);
3.39 + } else {
3.40 + return -1;
3.41 + }
3.42 +}
3.43 +
3.44 +char* Fronta::prijmiZpravu() {
3.45 + if (otevrena && prijimaci) {
3.46 + char zprava[DELKA_ZPRAVY + 1];
3.47 + zprava[DELKA_ZPRAVY] = '\0';
3.48 + if (mq_receive(fronta, zprava, DELKA_ZPRAVY, NULL) > 0) {
3.49 + return zprava;
3.50 + } else {
3.51 + return NULL;
3.52 + }
3.53 + } else {
3.54 + return NULL;
3.55 + }
3.56 +}
3.57 +
3.58 +void Fronta::zavriFrontu(bool zrusit) {
3.59 + if (otevrena) {
3.60 + if (zrusit) {
3.61 + mq_unlink(nazev);
3.62 + }
3.63 + mq_close(fronta);
3.64 + otevrena = false;
3.65 + }
3.66 +}
3.67 +
3.68 +
3.69 +
4.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
4.2 +++ b/c++/POSIXoveFronty/Fronta/fronta.h Tue Apr 07 01:16:04 2009 +0200
4.3 @@ -0,0 +1,42 @@
4.4 +#ifndef _FRONTA_H
4.5 +#define _FRONTA_H
4.6 +
4.7 +#include <string.h>
4.8 +#include <mqueue.h>
4.9 +
4.10 +/**
4.11 + * Objektový obal pro POSIXovou frontu (mq).
4.12 + */
4.13 +class Fronta {
4.14 +public:
4.15 + /** Vytvoří frontu (zapisovací umí i číst). */
4.16 + Fronta(char*, bool, bool);
4.17 + Fronta();
4.18 + /** Přidá zprávu do fronty. */
4.19 + int odesliZpravu(char*);
4.20 + /** Načte jednu zprávu z fronty. V případě chyby vrací NULL */
4.21 + char* prijmiZpravu();
4.22 + /** Zavře frontu. true = zruší frontu.*/
4.23 + void zavriFrontu(bool);
4.24 +
4.25 +private:
4.26 + char* nazev;
4.27 + bool prijimaci;
4.28 + bool odesilaci;
4.29 + bool otevrena;
4.30 + mqd_t fronta;
4.31 +
4.32 + /** Vlastnosti fronty */
4.33 + struct mq_attr mq_vlastnosti;
4.34 +
4.35 + /** Maximální počet zpráv ve frontě (potom začne blokovat) */
4.36 + static const int POCET_ZPRAV_VE_FRONTE = 5;
4.37 +
4.38 + /** Délka jedné zprávy ve frontě */
4.39 + static const int DELKA_ZPRAVY = 100;
4.40 +
4.41 +
4.42 +};
4.43 +
4.44 +#endif /* _FRONTA_H */
4.45 +
5.1 --- a/c++/POSIXoveFronty/Fronta/program.cpp Sun Apr 05 22:02:15 2009 +0200
5.2 +++ b/c++/POSIXoveFronty/Fronta/program.cpp Tue Apr 07 01:16:04 2009 +0200
5.3 @@ -6,9 +6,11 @@
5.4 #include <program.h>
5.5 #include <stdlib.h>
5.6 #include <iostream>
5.7 -#include <mqueue.h>
5.8 #include <readline/readline.h>
5.9 #include <signal.h>
5.10 +#include <strings.h>
5.11 +
5.12 +#include "fronta.h"
5.13
5.14 using namespace std;
5.15
5.16 @@ -23,9 +25,9 @@
5.17 signal(SIGTERM, zpracujSignal);
5.18 signal(SIGINT, zpracujSignal);
5.19
5.20 - /** Nastavíme vlastnosti fronty */
5.21 - mq_vlastnosti.mq_maxmsg = POCET_ZPRAV_VE_FRONTE;
5.22 - mq_vlastnosti.mq_msgsize = DELKA_ZPRAVY;
5.23 + /** TODO: zeptat se na název fronty */
5.24 + //strcpy(nazevFronty, VYCHOZI_NAZEV_FRONTY);
5.25 + nazevFronty = "/mojeFronta";
5.26
5.27 /** Program pracuje buď v režimu přijímání nebo odesílání */
5.28 if (isOdesilaciRezim()) {
5.29 @@ -34,7 +36,9 @@
5.30 prijimej();
5.31 }
5.32
5.33 - /** Sem se nedostaneme – program končí, až když dostane patřičný signál. */
5.34 + fronta.zavriFrontu(false);
5.35 +
5.36 + /** Sem se nedostaneme, pokud metody poběží v cyklu – program končí, až když dostane patřičný signál. */
5.37 return (EXIT_SUCCESS);
5.38 }
5.39
5.40 @@ -56,34 +60,29 @@
5.41
5.42 void odesilej() {
5.43 cout << "Odesíláme…" << endl;
5.44 + fronta = Fronta(nazevFronty, false, true);
5.45
5.46 - mqd_t fronta = mq_open(NAZEV_FRONTY, O_RDWR | O_CREAT, S_IRWXU | S_IRWXG, &mq_vlastnosti);
5.47 -
5.48 + /** TODO: načíst ze standardního vstupu */
5.49 char zprava[] = "zpráva";
5.50
5.51 - int vysledek = mq_send(fronta, zprava, strlen(zprava) + 1, 0);
5.52 - if (vysledek == 0) {
5.53 + if (fronta.odesliZpravu(zprava) == 0) {
5.54 cout << "Zpráva odeslána." << endl;
5.55 } else {
5.56 cout << "Při odesílání zprávy došlo k chybě." << endl;
5.57 }
5.58 -
5.59 - mq_close(fronta);
5.60 }
5.61
5.62 void prijimej() {
5.63 cout << "Přijímáme…" << endl;
5.64 + fronta = Fronta(nazevFronty, true, false);
5.65
5.66 - mqd_t fronta = mq_open(NAZEV_FRONTY, O_RDONLY);
5.67 - char s[DELKA_ZPRAVY + 1];
5.68 - s[DELKA_ZPRAVY] = '\0';
5.69 - if (mq_receive(fronta, s, DELKA_ZPRAVY, NULL) > 0) {
5.70 - printf("Přijatá zpráva: %s\n", s);
5.71 + char* zprava = fronta.prijmiZpravu();
5.72 +
5.73 + if (zprava == NULL) {
5.74 + cout << "Nepodařilo se přijmout zprávu." << endl;
5.75 } else {
5.76 - cout << "Nepodařilo se přijmout zprávu." << endl;
5.77 + printf("Přijatá zpráva: %s\n", zprava);
5.78 }
5.79 -
5.80 - mq_close(fronta);
5.81 }
5.82
5.83 void zpracujSignal(int signal) {
6.1 --- a/c++/POSIXoveFronty/Fronta/program.h Sun Apr 05 22:02:15 2009 +0200
6.2 +++ b/c++/POSIXoveFronty/Fronta/program.h Tue Apr 07 01:16:04 2009 +0200
6.3 @@ -3,7 +3,7 @@
6.4 * @autor František Kučera <franta-hg@frantovo.cz>
6.5 */
6.6
6.7 -#include <mqueue.h>
6.8 +#include "fronta.h"
6.9
6.10 #ifndef _PROGRAM_H
6.11 #define _PROGRAM_H
6.12 @@ -13,22 +13,19 @@
6.13 extern "C" {
6.14 #endif
6.15
6.16 - /** Název POSIXové fronty */
6.17 - const char* NAZEV_FRONTY = "/mojeFronta";
6.18 + /** Výchozé název POSIXové fronty. */
6.19 + const char* VYCHOZI_NAZEV_FRONTY = "/mojeFronta";
6.20
6.21 - /** Vlastnosti fronty */
6.22 - struct mq_attr mq_vlastnosti;
6.23 + /** Název POSIXové fronty. */
6.24 + char* nazevFronty;
6.25
6.26 - /** Maximální počet zpráv ve frontě (potom začne blokovat) */
6.27 - const int POCET_ZPRAV_VE_FRONTE = 5;
6.28 + /** Objekt obalující POSIXovou frontu. */
6.29 + Fronta fronta;
6.30
6.31 - /** Délka jedné zprávy ve frontě */
6.32 - const int DELKA_ZPRAVY = 100;
6.33 -
6.34 - /** Režim přijímání zpráv */
6.35 + /** Režim přijímání zpráv. */
6.36 void prijimej();
6.37
6.38 - /** Režim odesílání zpráv */
6.39 + /** Režim odesílání zpráv. */
6.40 void odesilej();
6.41
6.42 /**