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