Avatar billede heyn Nybegynder
04. august 2013 - 01:17 Der er 11 kommentarer og
1 løsning

At kommunikere med kørende programmer

Hej Eksperter

Jeg har lavet et program der kører i baggrunden.

Nu ønsker jeg at et javascript skal kunne bryde ind i det og igangsætte en funktion. Hvordan gør jeg programmets funktioner tilgængelige udefra?

Venligst Christian
Avatar billede arne_v Ekspert
04. august 2013 - 01:35 #1
Du vil have noget JavaScript kode til at kommunikere med et koerende native program skrevet i C++?

Umiddelbart vil jeg tro at det nemmeste vil vaere at bygge en mini HTTP server ind i C++ programmet, lade JavaScript sende HTTP requests til det og saa goer det hvad der skal goeres.

Det kraever et multithreaded C++ program. Hvilket igen goer at vi skal kende platformen.
Avatar billede segmose Nybegynder
04. august 2013 - 02:46 #2
Der er mange måder at tale med et program:

A) Events
kræver man laver nogle eventhandler i programmet.

B) HTTP
Skrives en passende fortolker og noget kommunikations kode.

C) delt hukommelse
Nogle passende OS kald.

D) Pipes
Findes forskellige modeller, en/to-vejs.

E) Interrupts
Programmet skal have en passende interrupt handler.

F) COM/CORBA
Der skal skrives noget interface kode.

Afhængigt at dit miljø kan man så finde ud af hvad der er bedst.
Avatar billede heyn Nybegynder
04. august 2013 - 03:32 #3
Systemet er Linux

Der var tidligere en der havde fortalt mig at det overhovedet ikke kunne lade sig gøre, men jeg anede jo nok at han tog fejl.

- Pipes? Er det ikke noget med at sende data gennem filer i /tmp? Det er hvad jeg gør lige nu.
- En HTTP fortolker? Det lyder vildt svært - Misforstår jeg noget?
- Delt hukommelse - Hvordan gøres det, det havde jeg nemlig overvejet?
- Hvordan laver man events og interrupthandlere i C?

Meningen er at mit C-program anvender en .so fil til at kommunikere med en dankortterminal. Lige nu sker det ved at programmet startes, og at der ved programstart overføres nogle argumenter. Men det er ikke optimalt. Man er jo nødt til at genstarte programmet ved hver transaktion. Heller ikke dette med at kommunikere gennem filer virker optimalt.

Faktisk er der lige nu en .so fil som laver visse call_backs når mit program anvender den. Men det er jo ikke helt det samme som med et JavaScript. Den skal jo være tilgængelig på kompileringstidspunktet.

Hvad vil være den bedste løsning?

Er der et sted hvor man kan se nogle simple eksempler på det i nævner, så jeg kan vurdere hvad der er bedst?

Venligst Christian
Avatar billede segmose Nybegynder
04. august 2013 - 13:27 #4
Min manglende kendskab til javascripts muligheder giver et problem med at sige hvad der er muligt her.

Pipes
http://linux.die.net/man/2/pipe
og
http://linux.die.net/man/7/pipe
eller
>DK.js | termProg

Sidste kræver at javascriptet kan skrive til stdout og du kan lave termProg om til at læse fra stdin. Dette er det absolut simpleste man kan lave af envejs program kommunikation.

HTTP fortolker, det behøver vel strengt taget ikke være pakket ind i noget så man skal bare åbne en ip forbindelse mellem dem så de kan sende din streng.

Shared memory og IPC
Der er nogle gode pointerer i http://stackoverflow.com/questions/5656530/how-to-use-shared-memory-with-linux-in-c

interrupts kan f.ex. klare sådan http://linux.die.net/man/2/sigaction
http://linux.die.net/man/2/select skulle også kunne klare dette og den er god hvis man ikke vil have busy waiting.

IPC er ikke let :)
Avatar billede arne_v Ekspert
04. august 2013 - 16:51 #5
Jeg foreslog netop HTTP fordi at det kan JavaScript snakke og det er ikke svaert at lave server side i C/C++ saalaenge at man ikke har krav til high performance og alle mulige finesser.
Avatar billede heyn Nybegynder
04. august 2013 - 17:55 #6
Kender i et sted med et eksempel på at lave sådan en fortolker?

Arne du skrev at man skulle lave threads (som jeg har glemt stort set alt om). Er det nødvendigt hvis der kun er en mulig bruger af gangen?

Nu nævner i C++. Jeg glemte at nævne at jeg anvender C. Gør det nogen forskel? Er C++ iøvrigt bagudkombatibel så al kode lavet i C også kan compileres af en C++ kompiler?

Venligst Christian
Avatar billede arne_v Ekspert
04. august 2013 - 18:14 #7
Hvis C/C++ programmet kun skal goere noget naar JavaScript beder det  goere noget saa behover du ikke threads.

Men skal du haandtere kontrol requests fra JavaScript og det som programmet goer idag uafhaengigt, saa skal du igang med traade.

Hvis du faar styr paa:
- socket programmering
- traade (POSIX threads paa Linux)
saa er der ikke mange ben i HTTP protokollen. Den er meget nem at forstaa og implementere.

C vs C++ goer ikke nogen fundamental forskel.

Som hovedregel vil C kode compile med en C++ compiler og fungere ens. Der er nogle smaa giftigheder. Men normalt vil det ikke vaere et problem.
Avatar billede heyn Nybegynder
04. august 2013 - 18:32 #8
Jaså - Det med  C ver. C++ skulle jeg bare have vidst tidligere. Jeg har udelukkende anvendt C fordi .h og .so og det medfølgende eksempel var lavet i C. Som jeg husker det er C++ trods alt en smule mere tilgængeligt end C når det drejer sig om at håndtere pointere og andre ting.

Nå - Så må jeg jo kaste mig over det.

Smider i et svar

I skulle vel ikke tilfældigvis kende en side med et par helt simple eksempler på socket og POSIX threads.

Vil den der kalder med JavaScriptet så kunne få svar el. er det envejs?

Venligst Christian
Avatar billede arne_v Ekspert
04. august 2013 - 18:38 #9
To vejs.

JavaScript sender request med input til C/C++ program.

C/C++ sender response med output tilbage til JavaScript.
Avatar billede heyn Nybegynder
04. august 2013 - 19:05 #11
Ok - Har kikket lidt på det og syntes jeg kan genkende noget.

Det skal nok gå. Mit problem er trods alt ikke VILDT kompliceret.

Arne du glemte svaret før :)

Og hvad med dig segmose?

Venligst Christian
Avatar billede arne_v Ekspert
04. august 2013 - 19:24 #12
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester