QNX – Illustration 02

Le code proposé à droite est celui de l'illustration 02 proposé dans le document remis en classe.

Quelques liens pour en savoir plus sur des outils clés de cet exemple :

#include <pthread.h>
#include <unistd.h>
#include <sys/neutrino.h>
#include <cerrno>
#include <iostream>
#include <cstdlib>
using namespace std;
void* emetteur(void*) {
   int id_canal = ChannelCreate (_NTO_CHF_UNBLOCK);
   cout << "Canal cree: " << id_canal << endl;
   if (id_canal == -1) {
      cerr << "ERREUR: creer un canal " << id_canal << '\n';
      exit(-1);
   }
   const int ID_PROCESSUS_APPELANT = 0;
   int id_connexion = ConnectAttach (
      0, ID_PROCESSUS_APPELANT,
      id_canal,
      0 |_NTO_SIDE_CHANNEL, // eviter les conflits
      0
   ); // flags
   if (id_connexion == -1) {
      cerr << "ERREUR: attacher au canal" << id_canal << '\n';
      exit (-1);
   }
   cout << "Canal " << id_canal << ", connexion " << id_connexion << endl;
   int priorite_pulsation = 10;
   int code = _PULSE_CODE_MAXAVAIL;
   int valeur = 3; // a transmettre au destinataire
   cout << "Pressez une touche puis ENTER pour emettre une pulsation..." << flush;
   char c;
   cin >> c;
   if (MsgSendPulse(id_connexion, priorite_pulsation, code, valeur) == -1)
      cerr << "ERREUR, emission sur canal " << id_connexion << '\n';
   else
      cout << "Pulsation sur la connexion " << id_connexion << endl;
   if (ConnectDetach(id_connexion) == -1)
      cerr << "ERREUR: deconnecter de la connexion " << id_connexion << '\n';
   if (ChannelDestroy(id_canal) == -1)
      cerr << "ERREUR: detruire le canal " << id_canal << '\n';
}
void* recepteur(void*) {
   int id_canal = 1;
   int id_connexion;
   const int ID_PROCESSUS_APPELANT = 0;
   int id_connexion = ConnectAttach(
      0, ID_PROCESSUS_APPELANT,
      id_canal, 0 |_NTO_SIDE_CHANNEL, // eviter les conflits
      0
   );
   if (id_connexion == -1) {
      cerr << "ERREUR: attacher au canal " << id_canal
           << ", code " << errno << '\n';
      exit (-1);
   }
   cout << "Connecte au canal " << id_canal
        << ", connexion " << id_connexion << endl;
   _pulse pulsation;
   _msg_info inf;
   int codeReception = MsgReceivePulse(
      id_canal, &pulsation, sizeof pulsation, &inf
   );
   switch (codeReception) {
   case -1:
      cerr << "ERREUR: recevoir pulsation, code " << errno << '\n';
      break;
   case 0:
      cout << "Pulsation recue, valeur: " << pulsation.value.sival_int << endl;
      break;
   default:
      cerr << "Attendait une pulsation, recu " << codeReception << '\n';
   }
   if (ConnectDetach (id_canal) == -1)
      cerr << "ERREUR: deconnecter du canal " << id_canal << '\n';
}
int main() {
   int erreur;
   pthread_t thEmetteur, thRecepteur;
   erreur = pthread_create(&thEmetteur, 0, emetteur, 0);
   if (erreur) {
      cerr << "Erreur, creation de emetteur(), code " << erreur << '\n';
      exit(-1);
   }
   erreur = pthread_create(&thRecepteur, 0, recepteur, 0);
   if (erreur) {
      cerr << "Erreur, creation de recepteur(), code " << erreur << '\n';
      exit(-1);
   }
   int *resultat;
   erreur = pthread_join(thRecepteur, reinterpret_cast<void **>(&resultat));
   if (erreur) {
      cerr << "Erreur, attente de recepteur(), code " << erreur << '\n';
      exit(-1);
   }
   erreur = pthread_join(thEmetteur, reinterpret_cast<void **>(&resultat));
   if (erreur) {
      cerr << "Erreur, attente de emetteur(), code " << erreur << '\n';
      exit(-1);
   }
}

Valid XHTML 1.0 Transitional

CSS Valide !