c++/POSIXoveFronty/Fronta/program.cpp
author František Kučera <franta-hg@frantovo.cz>
Tue, 07 Apr 2009 23:49:02 +0200
changeset 10 18317e52d52b
parent 8 e1b7dbc6dc4a
permissions -rw-r--r--
Odchytávání signálu SIGHUP → ukončení programu (po zavření terminálu)
     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 <readline/readline.h>
    10 #include <signal.h>
    11 #include <strings.h>
    12 
    13 #include "fronta.h"
    14 
    15 using namespace std;
    16 
    17 /**
    18  * Spuštění programu „POSIXovéFronty“
    19  */
    20 int main() {
    21 
    22     cout << "Vítejte v programu POSIXovéFronty" << endl;
    23 
    24     /** Nastavíme reakci na signál SIGTERM */
    25     signal(SIGTERM, zpracujSignal);
    26     signal(SIGINT, zpracujSignal);
    27     signal(SIGHUP, zpracujSignal);
    28 
    29     /** TODO: zeptat se na název fronty – readline */
    30     //strcpy(nazevFronty, VYCHOZI_NAZEV_FRONTY);
    31     nazevFronty = "/mojeFronta";
    32 
    33     /** Program pracuje buď v režimu přijímání nebo odesílání */
    34     if (isOdesilaciRezim()) {
    35         odesilej();
    36     } else {
    37         prijimej();
    38     }
    39 
    40     /** Sem se nedostaneme, pokud metody poběží v cyklu – program končí, až když dostane patřičný signál. */
    41     fronta.zavriFrontu(false);
    42     return (EXIT_SUCCESS);
    43 }
    44 
    45 bool isOdesilaciRezim() {
    46 
    47     cout << "Zvolte režim: (p)řijímací / (o)desílací" << endl;
    48 
    49     char odpoved = cin.get();
    50     cin.get();
    51 
    52     if (odpoved == 'o') {
    53         return true;
    54     } else if (odpoved == 'p') {
    55         return false;
    56     } else {
    57         return isOdesilaciRezim();
    58     }
    59 }
    60 
    61 void odesilej() {
    62     cout << "Odesíláme…" << endl;
    63     fronta = Fronta(nazevFronty, false, true);
    64 
    65     while (true) {
    66         /** TODO: načítat pomocí readline */
    67         char zprava[100];
    68         cout << "Zadejte zprávu: \033[22;32m"; // zelená
    69         cin.getline(zprava, 100);
    70         cout << "\033[0m\n";
    71 
    72         /** TODO: ošetřit ctrl+d (zacyklení) */
    73         if (fronta.odesliZpravu(zprava) == 0) {
    74             cout << "Zpráva odeslána." << endl;
    75         } else {
    76             cout << "Při odesílání zprávy došlo k chybě." << endl;
    77         }
    78     }
    79 }
    80 
    81 void prijimej() {
    82     cout << "Přijímáme…" << endl;
    83     fronta = Fronta(nazevFronty, true, false);
    84 
    85     while (true) {
    86         char* zprava = fronta.prijmiZpravu();
    87 
    88         if (zprava == NULL) {
    89             cout << "Nepodařilo se přijmout zprávu." << endl;
    90         } else {
    91             printf("Přijatá zpráva: \033[22;32m%s\033[0m\n", zprava); // zelená
    92         }
    93     }
    94 }
    95 
    96 void zpracujSignal(int signal) {
    97     if (signal == SIGTERM || signal == SIGINT || signal == SIGHUP) {
    98         fronta.zavriFrontu(false);
    99         cout << endl << "\033[22;31m" << "Končím program na základě signálu " << signal << "." << "\033[0m" << endl; // červená
   100         exit(1);
   101     }
   102 }
   103