PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Variable von PHP nach C



phoku
02-03-2003, 18:25
Hallo!

Wie kann ich über ein PHP-Skript eine Variable in einem laufenden C-Programm ändern?

Wie ist es z.B. möglich, aus PHP einen Integer in eine bestimmte Speicheradresse zu schreiben, und diese dann mit C auszulesen?

Vielen Dank für Hilfe und Tipps!

msi
02-03-2003, 19:49
shared memory, ich weiß allerdings nicht ob php das schon kann, ansonsten message queue. Suche einfach mal nach IPC oder inter process communication

Gruß Markus

jwebworks
03-03-2003, 09:38
phoku:

willst du eine Datenbank-Schnittstelle zum "Neverwinter Nights
Server" schreiben? :-D
Wenn Du geschafft hast, dich mit einem Programm zu verbinden,
kannst Du mir dann kurz umreissen wie Du es geschafft hast?

cu, stop.h

phoku
03-03-2003, 09:46
jwebworks:

ne, eigentlich nicht. wie kommst du darauf? ;)

Was ich eigentlich vorhab, ist meine Relaiskarte am Parallelport über das Internet zu steuern. So dass ich über das Internet Licht ein-/ausschalten, Fische füttern usw. kann:D

Das C-Programm hab ich mittels parapin schon realisiert, jetzt fehlt nur noch anbindung an C. Du bringst mich aber auf ne andere Lösung: Ich schreibe die Variable einfach in ne Datenbank, und lese die mit C aus... oder wird das zu systemlastig, wenn ich das stumpf in einer Schleife mache, damit es keine Verzögerungen gibt?

jwebworks
03-03-2003, 10:52
wie schnell soll das teil denn reagieren.
wenn du alle 5 sekunden nachschaust.

du kannst den auftrag ja auch in eine datei
schreiben und die auf änderungen hin
überwachen

cu, stop.h

phoku
03-03-2003, 11:41
ne, das soll nahezu in real-time geschehen.
per live-stream-webcam soll man das ganze beobachten können; und da wären verzögerungen ja ärgerlich.

msi
03-03-2003, 11:51
und wenn du das C Programm einfach von PHP aus aufrufst mit den nötigen Argumenten, es muss ja nicht immer laufen..

phoku
03-03-2003, 13:25
wäre wohl ne möglichkeit, stellt aber nicht zufrieden.
damit wären dann nur recht einfache programme möglich.

wenn ich z.b. übers internet sage "drehe die cam auf position 240°" muss das programm ja wissen, wo die cam gerade steht, um dann die nötige drehung zu machen. dafür muss die alte position immer in einer variablen gespeichert werden (und das soll nicht in einem file o.ä. geschehen).

elrond
03-03-2003, 14:20
möglich wäre auch eine kommunikation über tcp/ip-sockets. Dein c-prog könnte als serverprozess agieren und auf den soketconnect von php aus reagieren. ich hab sowas zwischen php auf linux und vb auf win zu laufen...

phoku
03-03-2003, 14:41
da ich die relaiskarte sowiso irgendwann autonom im netzwerk mit eigenem kleinem rechner laufen lassen wollte, hört sich das sehr sehr interessant an!

kannst du mir dazu weitere quellen schicken?

elrond
06-03-2003, 11:33
Hi,
ich habe einen serverprocess auf einer win-maschine laufen, der mittels crysal reports reports in pdf erzeugt. mit dem kommuniziere ich so:


global $PDFPFAD;
global $REPPFAD;
global $CRSERVER;

#vars festlegen
$param=str_replace("*","=",$param);
$pdffile=$PDFPFAD.str_replace("/","\\",urldecode($pdffile));
$repfile=$REPPFAD.$repfile;

#soket öffnen
$rsvr=fsockopen($CRSERVER,"7588");

if(!$rsvr) {echo "Keine Verbindung zum Report-Server";}
else {
#daten an report-server senden
fputs($rsvr,"#RSTART#".$repfile."#".$pdffile."#".$param);
$data=fread($rsvr,4);
#auf ok warten für datenempfang
if ($data=="#OK#") {
#auf ok warten für jobende
$data=fread($rsvr,4);
}
#verbindung schliessen
fclose($rsvr);
}


und der Server ist ein VB Programm das auf dem port 7588 auf verbindung wartet.

brotzi
06-03-2003, 13:35
geht auch noch einfacher:
Du erzeugst in deinem C-Programm einfach eine named pipe. Diese öffnest du im C-Programm lesend. Das PHP-Script muss dann nur diese Datei (daher named pipe) öfnnen, einen Befehl hineinschreiben und kann sie dann wieder löschen. Das Lesen in deinem C-Programm könnte blockierend sein.

phoku
06-03-2003, 13:42
Wie läßt sich das umsetzen?
Was ist eine "named pipe"?

brotzi
06-03-2003, 14:10
ganz einfach ein beispiel:



#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>

int main(void)
{
FILE* file;
int befehl;
int argument;

if (mkfifo("/tmp/mypipe", I_RUSR|IWUSR) != 0){
perror("pipe konnte nicht erzeugt werden");
return 1;
}

file = fopen("/tmp/mypipe","r");
if (!file){
perror("pipe konnte nicht geöffnet werden");
return 1;
}

while (fscanf(file,"%d,%d", &befehl, &argument) == 2){
//befehl und argument auswerten
if (befehl == 100) break; //befehl zum beenden
}

fclose(file);
return 0;
}


Damit wird eine pipe als datei "/tmp/mypipe" angelegt und lesend geöffnet. Dein php-Script muss dann nur immer Befehle der Form "integer,integer\n" hineinschreiben. Man kann natürlich auch Befehle als Strings nehmen.

phoku
06-03-2003, 14:16
hm, ne datei anzulegen ist aber bestimmt nicht die eleganteste lösung, oder?

elrond
06-03-2003, 14:18
Original geschrieben von phoku
hm, ne datei anzulegen ist aber bestimmt nicht die eleganteste lösung, oder?

...und funxt nur wenn der client filezugriff hat...also schwierig über mehrere rechner zu verteilen.

phoku
02-09-2003, 12:51
Original geschrieben von msi
und wenn du das C Programm einfach von PHP aus aufrufst mit den nötigen Argumenten, es muss ja nicht immer laufen..
wie mache ich das? wie sieht der aufruf aus php aus?