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);
}
}
|