franta-hg@5: /** franta-hg@5: * Program POSIXové Fronty franta-hg@5: * @autor František Kučera franta-hg@1: */ franta-hg@1: franta-hg@1: #include franta-hg@1: #include franta-hg@5: #include franta-hg@1: #include franta-hg@1: #include franta-hg@4: #include franta-hg@1: franta-hg@1: using namespace std; franta-hg@1: franta-hg@4: /** franta-hg@4: * Spuštění programu „POSIXovéFronty“ franta-hg@4: */ franta-hg@2: int main() { franta-hg@1: franta-hg@1: cout << "Vítejte v programu POSIXovéFronty" << endl; franta-hg@1: franta-hg@5: /** Nastavíme reakci na signál SIGTERM */ franta-hg@4: signal(SIGTERM, zpracujSignal); franta-hg@5: signal(SIGINT, zpracujSignal); franta-hg@4: franta-hg@5: /** Nastavíme vlastnosti fronty */ franta-hg@2: mq_vlastnosti.mq_maxmsg = POCET_ZPRAV_VE_FRONTE; franta-hg@2: mq_vlastnosti.mq_msgsize = DELKA_ZPRAVY; franta-hg@1: franta-hg@5: /** Program pracuje buď v režimu přijímání nebo odesílání */ franta-hg@1: if (isOdesilaciRezim()) { franta-hg@1: odesilej(); franta-hg@1: } else { franta-hg@1: prijimej(); franta-hg@1: } franta-hg@1: franta-hg@5: /** Sem se nedostaneme – program končí, až když dostane patřičný signál. */ franta-hg@1: return (EXIT_SUCCESS); franta-hg@1: } franta-hg@1: franta-hg@1: bool isOdesilaciRezim() { franta-hg@1: franta-hg@1: cout << "Zvolte režim: (p)řijímací / (o)desílací" << endl; franta-hg@1: franta-hg@1: char odpoved = cin.get(); franta-hg@1: cin.get(); franta-hg@1: franta-hg@1: if (odpoved == 'o') { franta-hg@1: return true; franta-hg@1: } else if (odpoved == 'p') { franta-hg@1: return false; franta-hg@1: } else { franta-hg@1: return isOdesilaciRezim(); franta-hg@1: } franta-hg@1: } franta-hg@1: franta-hg@1: void odesilej() { franta-hg@5: cout << "Odesíláme…" << endl; franta-hg@1: franta-hg@2: mqd_t fronta = mq_open(NAZEV_FRONTY, O_RDWR | O_CREAT, S_IRWXU | S_IRWXG, &mq_vlastnosti); franta-hg@2: franta-hg@2: char zprava[] = "zpráva"; franta-hg@1: franta-hg@4: int vysledek = mq_send(fronta, zprava, strlen(zprava) + 1, 0); franta-hg@4: if (vysledek == 0) { franta-hg@5: cout << "Zpráva odeslána." << endl; franta-hg@4: } else { franta-hg@5: cout << "Při odesílání zprávy došlo k chybě." << endl; franta-hg@4: } franta-hg@1: franta-hg@1: mq_close(fronta); franta-hg@1: } franta-hg@1: franta-hg@1: void prijimej() { franta-hg@5: cout << "Přijímáme…" << endl; franta-hg@1: franta-hg@1: mqd_t fronta = mq_open(NAZEV_FRONTY, O_RDONLY); franta-hg@2: char s[DELKA_ZPRAVY + 1]; franta-hg@2: s[DELKA_ZPRAVY] = '\0'; franta-hg@2: if (mq_receive(fronta, s, DELKA_ZPRAVY, NULL) > 0) { franta-hg@1: printf("Přijatá zpráva: %s\n", s); franta-hg@1: } else { franta-hg@5: cout << "Nepodařilo se přijmout zprávu." << endl; franta-hg@1: } franta-hg@1: franta-hg@1: mq_close(fronta); franta-hg@4: } franta-hg@1: franta-hg@4: void zpracujSignal(int signal) { franta-hg@5: if (signal == SIGTERM || signal == SIGINT) { franta-hg@5: cout << "Končím program na základě signálu " << signal << "." << endl; franta-hg@4: exit(1); franta-hg@4: } franta-hg@4: } franta-hg@1: