www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 
Sponsored by SiOL

sodelovanje med programi v različnih jezikih v Linuxu

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Linux, unix razprave
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3308
Aktiv.: 19.80
Kraj: Dragomer

PrispevekObjavljeno: Pon Apr 16, 2012 7:48 pm    Naslov sporočila:  sodelovanje med programi v različnih jezikih v Linuxu Odgovori s citatom

Nekoč, še za časa luknjanih kartic in so bili računalniki veliki kot omare, sem delal na IBM računalniku. Takrat smo programirali v različnih jezikih, assemblerju, RPG-u, Cobolu, Fortranu. In kar je bilo fino, je bilo to, da so ti jeziki sodelovali med seboj. Če je bil recimo glavni program pisan v Cobolu, pa je potreboval kake preračune, za katere je bil primernejši Fortran ali assembler, je glavni program na tem mestu poklical podprogram po imenu in z imeni spremeljivk, ki so vsebovale podatke, ki jih naj bi podprogram obdelal. V vseh jezikih se je tak klic imenoval Call.
Podprogram s tem imenom je bil seveda že preveden in je bil na razpolago nekje na disku, in le ta se je začel (spet v vseh jezikih) z ukazom Save (in parametri) le ta je spravil vse relevantne informacije klicočega programa na neke vrste stack, no ni bil stack, bila je savearea, ki jo je dal na razpolago klicoči program. Potem je podprogram veselo koristil vse mogoče registre, obdelal podatke, in končal z Return, ki je pred predajo kontrole nazaj glavnemu programu poskrbel, da so se z save spravljene vsebine vrnile na mesto, da lahko klicoči program nadaljuje z delom.

Te call, save in return rutine so bile predpisane v vseh programskih jeziki enako, tako da ni bilo važno, v katerem jeziku je pisan klicoči program in v katerem klicani podprogram.

Kolikor poznam Linux in C lahko v C-u kličem le funkcije, ki jih ali sam napišem spet v c-u ali so že napisane in se nahajajo v neki programski biblioteki na disku.

A tudi linux pozna veliko programskih orodij. (No jaz vem le za C in PHP, a to je moj problem) So stvari, ki jih ne znam narediti v PHP-u a jih znam narediti v C-u. Ali obstaja možnost, da bi na neki točki PHP programa enostavno poklical na pomoč podprogram v C-u, in bi se po opravljeni nalogi vrnil v PHP?

Vem, malo sem se razpisal, ampak z manj besedami ne znam postaviti vprašanja.
Oprostite dolgoveznosti, upam da niste med branjem že odklikali kam drugam

_________________
Charles Baudelaire:“Vragova največja zvijača je v tem, da je uspel prepričati svet, da ne obstaja.”
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
red_mamba
Član
Član



Pridružen-a: Ned 20 Feb 2005 17:56
Prispevkov: 1455
Aktiv.: 8.71
Kraj: Edinburgh

PrispevekObjavljeno: Pon Apr 16, 2012 7:54 pm    Naslov sporočila:   Odgovori s citatom

v php uporabi ukaz exec za klic programa kot bi ga iz ukazne vrstice.

http://php.net/manual/en/function.exec.php

pazi samo da ima tvoj www user pod katerim tece http streznik pravice za izvajanje tvojega programa.
vrnjene podatke lahko dalje uporabis v php-ju

_________________
Bad things happen to good people all the time for no reason!
LinkedIn @DavidLednik @redzmijo
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3308
Aktiv.: 19.80
Kraj: Dragomer

PrispevekObjavljeno: Pon Apr 16, 2012 9:03 pm    Naslov sporočila:   Odgovori s citatom

Uh, to bo pa spet veliko branja.

Gre za to, ker ne znam v PHP-u komunicirati z serijskim vrati, recimo RS232, sem naredil C program, ki to zna in ki po RS232 dobljene podatke piše v shared memory block, in drugi C program, ki tudi odpre isti shared memory block, a ta drugi C program je klican z exec v php-u, in tako dobi php podatke od C-a, seveda takrat, ko izvede exec ukaz.

Ker prihajajo podatki po RS232 slučajnostno, je prvi C program stalno aktiven in jih prestreže, tako po poti shared memory block, drugi C program klican z exec od php programa in naprej pridejo podatki v PHP.

Z exec se namreč C program kliče, izvede in konča. Tak program ni dober za komunikacijo, ker ni mogoče zagotoviti, da bo prestregel vse podatke, ki pridejo po RS232 serijskih vratih.

Ali je kakšna druga varianta, da bi C program predal podatke direktno php programu takorekoč v realnem času. Ta zapletena kombinacija z dvema C programoma, shared memory blokom in php programom, mi nekako estetsko ni všeč.
Pri mikroprocesorjih je preprosto: komunikacijo prepustim interrupt rutini, in ta, ko je podatek prebran, postavi zastavico in glavni program ve, da so na razpolago podatki za obdelavo. V linuxu pa kaj takega ne znam narediti.

_________________
Charles Baudelaire:“Vragova največja zvijača je v tem, da je uspel prepričati svet, da ne obstaja.”
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
mobwap
Član
Član



Pridružen-a: Sre 14 Mar 2012 9:42
Prispevkov: 326
Aktiv.: 3.56
Kraj: Doma

PrispevekObjavljeno: Pon Apr 16, 2012 9:28 pm    Naslov sporočila:   Odgovori s citatom

Vilko, rešitev je veliko, me pa vseeno zanima kaj se v php z podatki dejansko zgodi?
Jih zapisuješ v bazo ali kakšno datoteko? Da ne naštevam vseh možnosti dajmo najprej to opredelit kaj točno je cilj.

Dam samo en primer za začetek kot sem približno razumel težavo.

C program zajema podatek in ga shrani v memory, drug program ta memory prebere ko ga kličeš z php exec(drugi_C).

Poizkusi raje tako, prvi program še vedno deluje kot mora, samo mu dodaj funkcijo v kateri bo prejete podatke preveril in jih poslal php preko HTTP klica na php scripto.

libcurl boš verjetno potreboval v C-ju za HTTP povezavo.
Generiraš link http://localhost/pot/do/scripte.php&data=C-DATA
V php scripti pa uporabiš $data = $_GET["data"]; in pol scripta vsakič to izvede ko jo pokličeš iz C programa.

Predpostavljam da gredo podatki ali v bazo ali pa v datoteko...

[EDIT]
sem se ravnokar spomnil, sploh ne rabiš HTTP klica lahko kar iz C-ja kličeš
system(/pot/do/php /pot/do/scripta.php&data=C-DATA);


Nazadnje urejal/a mobwap Pon Apr 16, 2012 9:51 pm; skupaj popravljeno 1 krat
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
gregoral
Član
Član



Pridružen-a: Pet 24 Nov 2006 9:42
Prispevkov: 688
Aktiv.: 4.40
Kraj: Ljubljana

PrispevekObjavljeno: Pon Apr 16, 2012 9:37 pm    Naslov sporočila:   Odgovori s citatom

@Vilko:
Skoraj vse lahko narediš tudi v php-ju.

Svetujem ti, da če programa še nisi napisal, potem se potrudi in naredi v php-ju vse, boš imel manj težav.

Če imaš tisti del v C že napisan, potem mogoče če res ne gre drugače.

Vprašati pa se moraš še nekaj, ali ti zadostuje model:
zaženi, obdelaj, vrni rezultate, končaj (zapri vse datoteke in porte)

Ker če potrebuješ program, ki posluša na serijskem portu in mora poslušati tudi ko ga nisi klical, potem taka enostavna varianta ne bo dobra.

V tem primeru bi moral izdelati modul za php, ali pa uporabiti komunikacijo med dvemi programi.

Vsekakor bi bilo lažje svetovati, če bi malo bolj opisal kaj sploh želiš narediti.

LP, Gregor

EDIT: očitno sem predolgo pisal, pa ste že veliko postov napisali Smile
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
mobwap
Član
Član



Pridružen-a: Sre 14 Mar 2012 9:42
Prispevkov: 326
Aktiv.: 3.56
Kraj: Doma

PrispevekObjavljeno: Pon Apr 16, 2012 10:00 pm    Naslov sporočila:   Odgovori s citatom

gregoral je napisal/a:
@Vilko:
Skoraj vse lahko narediš tudi v php-ju.

Svetujem ti, da če programa še nisi napisal, potem se potrudi in naredi v php-ju vse, boš imel manj težav.
...


Moje osebne izkušnje s PHP in serijsko komunikacijo preko 232... Dela vendar ni zaneslivo. Pač moje menenje, ne zamerit Smile Sem dal v krepko quote ravno zato.
Jaz ponavadi na linuxu 232 preko shella zajamem pa kar preko CLI v bazo ali filet.
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
red_mamba
Član
Član



Pridružen-a: Ned 20 Feb 2005 17:56
Prispevkov: 1455
Aktiv.: 8.71
Kraj: Edinburgh

PrispevekObjavljeno: Pon Apr 16, 2012 10:15 pm    Naslov sporočila:   Odgovori s citatom

v PHP-ju sem 99.99% siguren da ne bos mogel poslusati RS232 podatkov kot lahko to pocnes v Cju. Saj moras imeti neke vrste programski FIFO ali vsaj event-e s katerimi lahko obdelas vhodne podatke ko jih sprejmes. V PHPju jih bo pa skripta spregledala.

Razen ce naredis PHP daemon Mr. Green

Sam sem RS232 daemon-a za krmiljenje SIM900 modula naredil z pythonom in je zadeva zelo lepo delovala. V Cju prav tako nebi smel imeti problemov.

_________________
Bad things happen to good people all the time for no reason!
LinkedIn @DavidLednik @redzmijo
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
gregoral
Član
Član



Pridružen-a: Pet 24 Nov 2006 9:42
Prispevkov: 688
Aktiv.: 4.40
Kraj: Ljubljana

PrispevekObjavljeno: Pon Apr 16, 2012 10:19 pm    Naslov sporočila:   Odgovori s citatom

Pisal sem preden je bilo govora o serijskem portu Smile.

No se mi je pa zdelo da bi lahko šlo za ta primer.

Pomembno vprašanje tukaj je ali gre samo za logger ali gre za dvosmerno komunikacijo z napravo na serijskem portu (tukaj so ponavadi časovne omejitve).

Če gre samo za logger, potem naj C program piše v datoteko ali bazo.
Php pa potem lahko prebere te datoteke in izpiše tabele, grafe, trende, ...

Če je govora o dvosmerni zadevi, kjer se na podlagi prebranega sporočila odloča in potem pošilja nazaj na serijski port, potem je pa verjetno bolj smiselno implementirati to logiko v C.
Po potrebi naj C program bere konfiguracijsko datoteko, ki jo nastavljaš preko php strani.

Program ki komunicira z napravo mora po mojem delovati samostojno, saj se php skripta izvede samo ko naložiš stran v brskalniku, sicer pa se php koda ne izvaja.

Skratka še vedno je precej tega še "odprtega".

Če se omejim na Vilko-tovo vprašanje je pa eno od naštetega:
- C -> shared memory -> C -> php
- C -> log file -> C -> php
- C -> log file -> php
- C <-> TCP socket <-> php
- php -> UDP query -> C -> UDP result -> php
- komunikacija preko proc file sistema
- drugo

Komunikacija C->php izvedeš tako da C kliče php skripto s parametri.
(http://localhost/...xyz.php?data=fdfkgdjhg)

TCP socket je rešitev kjer C program odpre socket (bind) posluša (listen),
prevzame (accept), in izvaja ukaze ki jih pošilja klient (read, write).

UDP query je podobno, le da C program čaka na UDP paket na katerega nato odgovori.

Linux pozna proc file system, ki je v osnovi namenjen komunikaciji med driverji in jedrom ter uporabniškimi programi, ampak mislim da ga lahko uporabiš tudi za komunikacijo med dvemi programi (tega nisem nikoli počel, zato nisem 100% da je tako enostavno).

LP, Gregor
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3308
Aktiv.: 19.80
Kraj: Dragomer

PrispevekObjavljeno: Tor Apr 17, 2012 9:10 am    Naslov sporočila:   Odgovori s citatom

Joj, fantje, natresli ste mi marsikaj, in težko bom to prebavil.
Tako v C-u sem začetnik in sem komaj naredil tisto, kar sem povedal, php pa piše en drug programer, ki pa zame nima dosti časa.

V globalu gre za nadzor in upravljanje raznih mikroprocesorskih ploščic, ki po hiši delajo to in ono in so med seboj povezani po RS485 mreži, toda nadzor naj bi bil po internetu preko linuxa - php-a. Prehod RS485-RS232 sem kupil od kitajcev in dela v redu.

Pravzaprav se dela, kot sem opisal, le estetsko sem ni ne zdi prav strokovna rešitev, bolj flikarija. Upravljanje in nadzor delujeta, le zaradi shared memory in rs485 komunikacije pride do časovnih zamikov, ki pa pri nadzoru hiše niso kritični.

Lepše bi bilo, da ko se 'nadzornik' prijavi preko interneta, da se php sam prijavi na mrežo, in odda ukaze in dobi sveže podatke,

Ampak hvala. Razlika je premalo vredna, da bi se jaz še veliko ukvarjal z zadevo. Dela, in bom s tem, kar sem naredil zadovoljen.

Tisto prvo vprašanje pa, da program napisan v enem jeziku ne more vključit v sebe podprogram v drugem jeziku, kot je bilo to včasih (ko sem bil mlad, he) me pa razočara. Dobre in praktične stvari ni za zavreči.

Prosim, da zaključimo temo, sem zadovoljen, da dela, ostalo ni važno,

Kitajski pregovor pravi:
Ni važno, kakšne barve je mačka, važno je, da lovi miši.

_________________
Charles Baudelaire:“Vragova največja zvijača je v tem, da je uspel prepričati svet, da ne obstaja.”
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
urosg
Član
Član



Pridružen-a: Pet 27 Apr 2007 14:30
Prispevkov: 542
Aktiv.: 3.59
Kraj: Domžale

PrispevekObjavljeno: Tor Apr 17, 2012 9:17 am    Naslov sporočila:   Odgovori s citatom

Vilko, po mojem mnenju bi veliko bolj pametno naredil če bi kupil kakšen ETH-RS232 prehod, saj bi potem lahko direktno s PHPjem preko socketa dostopal do vsake naprave, če pa imaš povezave že vzpostavljene in jih zaključuješ z eno RS232 povezavo na računalniku ti pa priporočam, da si narediš nek RS232-TCP/IP service, kjer se potem spet z socket-om povežeš na TCP/IP port in komuniciraš z napravami kot direktno prek RS232.

Problem ti seveda nastane takrat ko bi želel imeti "PUSH" podatkov s strani naprave, to bi pa jaz na tvojem mestu rešil tako, da bi nek service, ki posluša na RS232 portu zapisoval zadeve v neko tabelo (najlažje mysql) ali file, potem pa ti v spletni aplikaciji preko AJAXa delaš "refreshe" vsako sekundo, kjer ti potem php skripta iz tabele/datoteke prebere zadnje posodobitve in se ti potem (z zamikom do ene sekunde) lahko posodablja spletni vmesnik.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
gregoral
Član
Član



Pridružen-a: Pet 24 Nov 2006 9:42
Prispevkov: 688
Aktiv.: 4.40
Kraj: Ljubljana

PrispevekObjavljeno: Tor Apr 17, 2012 1:15 pm    Naslov sporočila:   Odgovori s citatom

vilko je napisal/a:
... da program napisan v enem jeziku ne more vključit v sebe podprogram v drugem jeziku, kot je bilo to včasih ...


Saj je še vedno tako, prevajalniki (v resnici linker) lahko izpljune samostojen program ali pa knjižnico.

Glavna razlika med programom in knjižnico je ta da ima program funkcijo main ki jo pokliče operacijski sistem ko požene program.

Knjižnice lahko uporabljaš v programih in kličeš funkcije ki so v njih.
Tako delujejo C, C++, Assembler, in še malo morje drugih jezikov.

Je pa res da v skriptnih jezikih (php, za python pa ne vem) ne moreš izdelati knjižnic.

Popolnoma neodvisno od tega je pa problem prenosa podatkov med več procesi.
Tako kot si včasih klical save, lahko še danes (zapišeš v datoteko), program ki ga pokličeš jo prebere obdela in vanjo zapiše rezultate.

Točno tako kot si to počel včasih lahko počneš še danes.
Problem pri takem početju je lahko hitrost, in pa konstantno prepisovanje flash pomnilnika. Zato je bolje imeti tako datoteko v pomnilniku.

Marsikaj se da, ni pa trivialno.

LP, Gregor
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
piflar
Član
Član



Pridružen-a: Čet 06 Dec 2007 17:56
Prispevkov: 246
Aktiv.: 1.71
Kraj: Krško

PrispevekObjavljeno: Tor Apr 17, 2012 8:27 pm    Naslov sporočila:   Odgovori s citatom

A smo spet pri c++ php interakciji? Smile Daj napiši (ali ZS, če je stvar bolj zaupne narave) kaj rabiš pa se mogoče kdo najde, ki ti to spiše ali kako drugače pomaga. Za plačilo ali kakšen pir. Very Happy ...če je pa res zanimivo pa tudi zastonj.

Drugače pa, če ne delaš kakšnega web vmesnika za kakšen control center pusti skriptane jezike pri miru. Če že ravno delaš blizu hardveru. Php je tudi bolj boga izbira dandanašnji - moje skromno mnenje.

Lp
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Linux, unix razprave Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 146 dni


Powered by phpBB © 2001, 2005 phpBB Group