Gå til innhold

Hvordan kommunisere mellom prosesser...


Anbefalte innlegg

Nå er det slik at jeg driver å programmerer diverse ting som vil kjøre i forskjellige prosesser, og som vil sende data til hverandre...

Det jeg har lyst å gjøre er å lage et objekt som et program kan benytte seg av, og ved å bruke det vil det kunne kommunisere med alle andre programmer som også bruker objektet...

Problemet mitt er at jeg vet ikke helt hvordan jeg skal kommunisere mellom prosessene, en ting å merke seg er at det er windows jeg tenker på nå, linux skulle vel funke med fifo...

 

Kan avsløre litt av planene jeg har...

Jeg skal lage en lcd styring som forker i to ekstra prosesser, en til å håndtere output på displayet, og en til å scanne etter input...

Dessuten skal lcd styringa kunne kommunisere med softbus styringa slik at jeg kan se status på lcd og sette fart med knappene...

 

Mulig jeg kan ha en prosess som funker som hub/switch for kommunikajon slik at alle objektene kobler seg opp mot den, og den sender data frem og tilbake, men dette får jeg tenke på senere...

Lenke til kommentar
Videoannonse
Annonse

Jeg kan ikke fordra Windows og har ikke råd til å betale for en compiler - så jeg kan istedet vise deg et eksempel der jeg bruker posix-threads som er mer Linux'ish.

 

Bruker her MinGW som compiler under Windows, og har MingGW installert i C:MinGW -katalogen.

MinGW finner du her: http://www.mingw.org/ (er en del forskjellige pakker å velge i når man skal laste ned, jeg lastet ned pakken med navnet "MinGW")

Siden pthreads-biblioteket ikke følger med MinGW compileren må du laste ned dette selv.

 

 

Du trenger

Biblioteket:

ftp://sources.redhat.com/pub/pthreads-win...libpthreadGCE.a

..som du legger i C:MinGWlib og renamer til libpthread.a

.. og headerfilene:

ftp://sources.redhat.com/pub/pthreads-win...clude/pthread.h

ftp://sources.redhat.com/pub/pthreads-win...include/sched.h

ftp://sources.redhat.com/pub/pthreads-win...ude/semaphore.h

..som du legger i C:MinGWinclude

 

 

Eksempelkode

#include <iostream>

#include <sstream>

#include <pthread.h>

#include <unistd.h>



using namespace std;



// Dette for at visse ting skal være likt mellom Linux og Win32(MinGW)

#ifdef _WIN32

#define strupr _strupr

#define strncasecmp _strnicmp

#ifdef __GNUC__

#define sleep(t) _sleep(t*1000)

#define kbhit _kbhit

#endif

#endif





stringstream buffer; // denne kan brukes til å kommunisere mellom prosessene hare() og rev()

pthread_mutex_t mutex;



void *hare(void* param)

{

int* i = static_cast<int*>(param);

*i++;

for(;;){

 cerr << "Hare" << endl;

 pthread_mutex_lock(&mutex);

 buffer << "Hare ";

 pthread_mutex_unlock(&mutex);

 sleep(2);

}

}





void *rev(void* param)

{

int* i = static_cast<int*>(param);

*i++;

for(;;){

 cerr << "tRev" << endl;

 pthread_mutex_lock(&mutex);

 buffer << "Rev ";

 pthread_mutex_unlock(&mutex);

 sleep(4);

}

}





int main(int argc, char** argv)

{

pthread_t hareThread;

pthread_t revThread;

pthread_mutex_init(&mutex, 0);



cerr << "buffer før kjøring: "" << buffer.str() << """ << endl;



cerr << "--" << endl;



pthread_create(&hareThread, 0, hare, 0);

pthread_create(&revThread, 0, rev, 0);

sleep(10);

pthread_mutex_lock(&mutex);



cerr << "--" << endl;

cerr << "buffer etter kjøring: "" << buffer.str() << """ << endl;

return(0);   

} 

 

..lagre filen som main.cpp og kompiler den slik:

 

 

Kompilering

Regner med at du vet hvordan man får frem en kommandolinje i Windows og at du kan bruke den?

g++ -g -Wall main.cpp -o main -lpthread

..det er viktig at -lpthread kommer bakerst!

Hvis du i stedet velger å bruke Linux :) , er compileringen helt lik.

 

 

Kjøring

Når jeg kjører programmet får jeg denne utskriften:

buffer før kjøring: ""

--

Hare

Rev

Hare

Rev

Hare

Hare

Rev

Hare

--

buffer etter kjøring: "Hare Rev Hare Rev Hare Hare Rev Hare "

 

 

Kort forklaring av mutex

Mutex er et begrep som gjelder thread-programmering generellt.

pthread_mutex_lock saken gjør at funksjonene hare() og rev() ikke skriver til buffer samtidig - noe som kunne gitt resultater som:

 

buffer etter kjøring: "HaRerve HaRreve HarReev RevH are HareRe HvHare "

 

 

Her er en oversikt over IPC-teknologier spesiellt for Windows: http://msdn.microsoft.com/library/default....munications.asp

Lenke til kommentar

Dette forstod jeg tror jeg... :D

Bruker både windows og linux selv da, men som jeg skrev i første posten skal jeg skrive noe som funker på begge systemer...

Men pthreads, funker det nå slik at to underprosesser startes av pthreads_create() og de har hare() og rev() som hovedfunksjon?

I såfall forstår jeg :D

 

Selvfølgelig kan jeg bruke kommandolinje i både linux og win, og når jeg compiler noe bruker jeg make ;)

Har både minGW og Borland C++, og har i det siste brukt sistnevnte...

 

Skal undersøke litt mer om dette selv og se hva jeg får til...

Lenke til kommentar

Ser ut som du like gjerne kan bruke tråder som prosesser, tråder deler minne, så du slipper problemene med interprosess-kommunikasjon (som kan bli ganske hårete i Windows så vidt jeg forstår). Du kan f.eks bruke boost::thread som en kryssplattform abstraksjon for oppretting av tråder etc.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...