c++/POSIXoveFronty/Fronta/program.cpp
author František Kučera <franta-hg@frantovo.cz>
Sun, 05 Apr 2009 22:02:15 +0200
changeset 5 a6822e6dd2ca
parent 4 fb862232e704
child 6 617fef4676b9
permissions -rw-r--r--
Komentáře, drobnosti
franta-hg@5
     1
/**
franta-hg@5
     2
 * Program POSIXové Fronty
franta-hg@5
     3
 * @autor František Kučera <franta-hg@frantovo.cz>
franta-hg@1
     4
 */
franta-hg@1
     5
franta-hg@1
     6
#include <program.h>
franta-hg@1
     7
#include <stdlib.h>
franta-hg@5
     8
#include <iostream>
franta-hg@1
     9
#include <mqueue.h>
franta-hg@1
    10
#include <readline/readline.h>
franta-hg@4
    11
#include <signal.h>
franta-hg@1
    12
franta-hg@1
    13
using namespace std;
franta-hg@1
    14
franta-hg@4
    15
/**
franta-hg@4
    16
 * Spuštění programu „POSIXovéFronty“
franta-hg@4
    17
 */
franta-hg@2
    18
int main() {
franta-hg@1
    19
franta-hg@1
    20
    cout << "Vítejte v programu POSIXovéFronty" << endl;
franta-hg@1
    21
franta-hg@5
    22
    /** Nastavíme reakci na signál SIGTERM */
franta-hg@4
    23
    signal(SIGTERM, zpracujSignal);
franta-hg@5
    24
    signal(SIGINT, zpracujSignal);
franta-hg@4
    25
franta-hg@5
    26
    /** Nastavíme vlastnosti fronty */
franta-hg@2
    27
    mq_vlastnosti.mq_maxmsg = POCET_ZPRAV_VE_FRONTE;
franta-hg@2
    28
    mq_vlastnosti.mq_msgsize = DELKA_ZPRAVY;
franta-hg@1
    29
franta-hg@5
    30
    /** Program pracuje buď v režimu přijímání nebo odesílání */
franta-hg@1
    31
    if (isOdesilaciRezim()) {
franta-hg@1
    32
        odesilej();
franta-hg@1
    33
    } else {
franta-hg@1
    34
        prijimej();
franta-hg@1
    35
    }
franta-hg@1
    36
franta-hg@5
    37
    /** Sem se nedostaneme – program končí, až když dostane patřičný signál. */
franta-hg@1
    38
    return (EXIT_SUCCESS);
franta-hg@1
    39
}
franta-hg@1
    40
franta-hg@1
    41
bool isOdesilaciRezim() {
franta-hg@1
    42
franta-hg@1
    43
    cout << "Zvolte režim: (p)řijímací / (o)desílací" << endl;
franta-hg@1
    44
franta-hg@1
    45
    char odpoved = cin.get();
franta-hg@1
    46
    cin.get();
franta-hg@1
    47
franta-hg@1
    48
    if (odpoved == 'o') {
franta-hg@1
    49
        return true;
franta-hg@1
    50
    } else if (odpoved == 'p') {
franta-hg@1
    51
        return false;
franta-hg@1
    52
    } else {
franta-hg@1
    53
        return isOdesilaciRezim();
franta-hg@1
    54
    }
franta-hg@1
    55
}
franta-hg@1
    56
franta-hg@1
    57
void odesilej() {
franta-hg@5
    58
    cout << "Odesíláme…" << endl;
franta-hg@1
    59
franta-hg@2
    60
    mqd_t fronta = mq_open(NAZEV_FRONTY, O_RDWR | O_CREAT, S_IRWXU | S_IRWXG, &mq_vlastnosti);
franta-hg@2
    61
franta-hg@2
    62
    char zprava[] = "zpráva";
franta-hg@1
    63
franta-hg@4
    64
    int vysledek = mq_send(fronta, zprava, strlen(zprava) + 1, 0);
franta-hg@4
    65
    if (vysledek == 0) {
franta-hg@5
    66
        cout << "Zpráva odeslána." << endl;
franta-hg@4
    67
    } else {
franta-hg@5
    68
        cout << "Při odesílání zprávy došlo k chybě." << endl;
franta-hg@4
    69
    }
franta-hg@1
    70
franta-hg@1
    71
    mq_close(fronta);
franta-hg@1
    72
}
franta-hg@1
    73
franta-hg@1
    74
void prijimej() {
franta-hg@5
    75
    cout << "Přijímáme…" << endl;
franta-hg@1
    76
franta-hg@1
    77
    mqd_t fronta = mq_open(NAZEV_FRONTY, O_RDONLY);
franta-hg@2
    78
    char s[DELKA_ZPRAVY + 1];
franta-hg@2
    79
    s[DELKA_ZPRAVY] = '\0';
franta-hg@2
    80
    if (mq_receive(fronta, s, DELKA_ZPRAVY, NULL) > 0) {
franta-hg@1
    81
        printf("Přijatá zpráva: %s\n", s);
franta-hg@1
    82
    } else {
franta-hg@5
    83
        cout << "Nepodařilo se přijmout zprávu." << endl;
franta-hg@1
    84
    }
franta-hg@1
    85
franta-hg@1
    86
    mq_close(fronta);
franta-hg@4
    87
}
franta-hg@1
    88
franta-hg@4
    89
void zpracujSignal(int signal) {
franta-hg@5
    90
    if (signal == SIGTERM || signal == SIGINT) {
franta-hg@5
    91
        cout << "Končím program na základě signálu " << signal << "." << endl;
franta-hg@4
    92
        exit(1);
franta-hg@4
    93
    }
franta-hg@4
    94
}
franta-hg@1
    95