c++/POSIXoveFronty/Fronta/fronta.cpp
author František Kučera <franta-hg@frantovo.cz>
Tue, 07 Apr 2009 23:49:02 +0200
changeset 10 18317e52d52b
parent 6 617fef4676b9
permissions -rw-r--r--
Odchytávání signálu SIGHUP → ukončení programu (po zavření terminálu)
     1 #include <fronta.h>
     2 #include <iostream>
     3 
     4 using namespace std;
     5 
     6 Fronta::Fronta() {
     7     prijimaci = false;
     8     odesilaci = false;
     9     otevrena = false;
    10 }
    11 
    12 Fronta::Fronta(char* nazev, bool prijimaci, bool odesilaci) {
    13     this->nazev = nazev;
    14     this->prijimaci = prijimaci;
    15     this->odesilaci = odesilaci;
    16 
    17     /** Nastavíme vlastnosti fronty */
    18     mq_vlastnosti.mq_maxmsg = POCET_ZPRAV_VE_FRONTE;
    19     mq_vlastnosti.mq_msgsize = DELKA_ZPRAVY;
    20 
    21     /** Vytvoříme odesílací (obojetnou) nebo (pouze) čtecí frontu */
    22     if (odesilaci) {
    23         fronta = mq_open(nazev, O_RDWR | O_CREAT, S_IRWXU | S_IRWXG, &mq_vlastnosti);
    24         otevrena = true;
    25     } else if (prijimaci) {
    26         fronta = mq_open(nazev, O_RDONLY);
    27         otevrena = true;
    28     } else {
    29         otevrena = false;
    30     }
    31 }
    32 
    33 int Fronta::odesliZpravu(char* zprava) {
    34     if (otevrena && odesilaci) {
    35         return mq_send(fronta, zprava, strlen(zprava) + 1, 0);
    36     } else {
    37         return -1;
    38     }
    39 }
    40 
    41 char* Fronta::prijmiZpravu() {
    42     if (otevrena && prijimaci) {
    43         char zprava[DELKA_ZPRAVY + 1];
    44         zprava[DELKA_ZPRAVY] = '\0';
    45         if (mq_receive(fronta, zprava, DELKA_ZPRAVY, NULL) > 0) {
    46             return zprava;
    47         } else {
    48             return NULL;
    49         }
    50     } else {
    51         return NULL;
    52     }
    53 }
    54 
    55 void Fronta::zavriFrontu(bool zrusit) {
    56     if (otevrena) {
    57         if (zrusit) {
    58             mq_unlink(nazev);
    59         }
    60         mq_close(fronta);
    61         otevrena = false;
    62     }
    63 }
    64 
    65 
    66