c++/POSIXoveFronty/Fronta/program.cpp
author František Kučera <franta-hg@frantovo.cz>
Sun, 05 Apr 2009 21:08:09 +0200
changeset 4 fb862232e704
parent 2 f1aae09bb78e
child 5 a6822e6dd2ca
permissions -rw-r--r--
Zpracování signálu SIGTERM → vypsání hlášky a ukončení programu.
     1 /* 
     2  * File:   program.cpp
     3  * Author: fiki
     4  *
     5  * Created on 1. duben 2009, 23:54
     6  */
     7 
     8 #include <program.h>
     9 #include <stdlib.h>
    10 //#include <iostream>
    11 #include <c++/4.3.2/iostream>
    12 #include <mqueue.h>
    13 #include <readline/readline.h>
    14 #include <signal.h>
    15 
    16 using namespace std;
    17 
    18 /**
    19  * Spuštění programu „POSIXovéFronty“
    20  */
    21 int main() {
    22 
    23     cout << "Vítejte v programu POSIXovéFronty" << endl;
    24 
    25     signal(SIGTERM, zpracujSignal);
    26 
    27     mq_vlastnosti.mq_maxmsg = POCET_ZPRAV_VE_FRONTE;
    28     mq_vlastnosti.mq_msgsize = DELKA_ZPRAVY;
    29 
    30 
    31     //cout << "maxmsg: " << ma.mq_maxmsg;
    32     //cout << "msgsize: " << ma.mq_msgsize;
    33 
    34 
    35 
    36 
    37     //cout << NAZEV_FRONTY << endl;
    38 
    39     if (isOdesilaciRezim()) {
    40         odesilej();
    41     } else {
    42         prijimej();
    43     }
    44 
    45 
    46 
    47 
    48 
    49     return (EXIT_SUCCESS);
    50 }
    51 
    52 bool isOdesilaciRezim() {
    53     //char *odpoved = readline("Zvolte režim: (p)řijímací / (o)desílací");
    54 
    55     cout << "Zvolte režim: (p)řijímací / (o)desílací" << endl;
    56 
    57     char odpoved = cin.get();
    58     cin.get();
    59 
    60     if (odpoved == 'o') {
    61         return true;
    62     } else if (odpoved == 'p') {
    63         return false;
    64     } else {
    65         return isOdesilaciRezim();
    66     }
    67 }
    68 
    69 void odesilej() {
    70     cout << "odesíláme" << endl;
    71 
    72 
    73 
    74     mqd_t fronta = mq_open(NAZEV_FRONTY, O_RDWR | O_CREAT, S_IRWXU | S_IRWXG, &mq_vlastnosti);
    75 
    76     char zprava[] = "zpráva";
    77 
    78     int vysledek = mq_send(fronta, zprava, strlen(zprava) + 1, 0);
    79     if (vysledek == 0) {
    80         cout << "Zpráva odeslána" << endl;
    81     } else {
    82         cout << "Při odesílání zprávy došlo k chybě" << endl;
    83     }
    84 
    85     //cin.get();
    86 
    87     mq_close(fronta);
    88 }
    89 
    90 void prijimej() {
    91     cout << "přijímáme" << endl;
    92 
    93     mqd_t fronta = mq_open(NAZEV_FRONTY, O_RDONLY);
    94     char s[DELKA_ZPRAVY + 1];
    95     s[DELKA_ZPRAVY] = '\0';
    96     if (mq_receive(fronta, s, DELKA_ZPRAVY, NULL) > 0) {
    97         printf("Přijatá zpráva: %s\n", s);
    98     } else {
    99         cout << "Nepodařilo se přijmout zprávu" << endl;
   100     }
   101 
   102     //mq_unlink(NAZEV_FRONTY);
   103     mq_close(fronta);
   104 }
   105 
   106 void zpracujSignal(int signal) {
   107     if (signal == SIGTERM) {
   108         cout << "Končím program na základě signálu " << signal << endl;
   109         exit(1);
   110     }
   111 }
   112