002
10.03.2009, 09:48 Uhr
~Tallan
Gast
|
Zitat von 0xdeadbeef: |
Prozess 2 kann jedenfalls nicht direkt in den Speicher von Prozess 1 kucken, ggf. wird Prozess 1 Prozess 2 die Information schon übermitteln müssen. Der einfachste, übliche Weg dafür sind wohl Pipes - in POSIX etwa so gesprochen:
C++: |
#include <sys/types.h> #include <sys/wait.h> #include <unistd.h>
#include <limits.h> #include <stddef.h> #include <stdio.h> #include <stdlib.h>
void main_process(int pipes[2], pid_t child_pid) { int x = 0; int status;
close(pipes[1]);
waitpid(child_pid, &status, 0);
read(pipes[0], &x, sizeof(int)); close(pipes[0]);
printf("C2's return value: %d\n", x);
if(WIFEXITED(status)) { printf("C1's return value: %d\n", WEXITSTATUS(status)); } }
void child2(void);
void child1(int pipes[2]) { int x; pid_t pid; int status;
close(pipes[0]);
pid = fork();
if(pid == -1) { fputs("Fehler beim Forken in Child 1!", stderr); } else if(pid == 0) { close(pipes[1]); child2(); } else { waitpid(pid, &status, 0);
if(WIFEXITED(status)) { x = WEXITSTATUS(status); } else { x = INT_MIN; }
write(pipes[1], &x, sizeof(int)); }
close(pipes[1]); }
void child2(void) { execlp("false", "false", NULL); }
int main(void) { pid_t pid; int pipes[2];
pipe(pipes); pid = fork();
if(pid == -1) { close(pipes[0]); close(pipes[1]); fputs("Fehler beim Forken!", stderr); } else if(pid == 0) { child1(pipes); } else { main_process(pipes, pid); }
return 0; }
|
|
Also erstmal vielen dank für die viele Mühe, leider ist das nicht das was ich meinte, ich versuch es mal anders zu erklären:
Ich habe wiegesagt 2 Prozesse nennen wir sie P1 und P2 in P2 läuft irgend ein kommandozeilenorientiertes programm , als beispiel sqlplus oder einfacher eine shell P1 ist dafür zuständig von nutzer befehle entgegenzunehmen diese an p2 zu schicken und dann soll p1 solange warten bis p2 die befehle verarbeitet hat. Hier ist der springende punkt ich weiss nicht wann p2 fertig ist, zum einen ist nicht sicher ob nun sqlplus oder sh oder sonstwas in p2 läuft, zum anderen wird p2 auch nicht beendet, sondern nur der befehl den an das in p2 laufende programm geht ausgeführt.
Mittels select und abfragen der ausgangspipe von p2 funktioniert das ganze , allerdings NUR wenn der befehl der an p2 geht auch einen datenoutput erzeugt
Als beispiel wie es funktioniert
in p2 läuft eine shell p1 sendet ls wartet per select auf antwort von p2 ( über pipes gelöst ) p2 verarbeitet ls sendet die dateien und ordner die mit ls gefundne werden an p1 zurück p1 verlässt select bei datenimput ...
Was nicht funktioniert genau wie oben nur statt ls den befehl mkdir x ( erzeugt keinen output ) => select schläft ewig in p1
und ich weiss einfach nicht wie ich jetzt rausbekomme ob mkdir in p2 ausgeführt wurde ( liefert ja nur einen return 0 an p2 ) spezifische lösungen funktionieren nicht, da a) statt der shell in p2 auch etwas andere laufen kann ( sqlplus etc.. ) b) der befehl nicht bekannt ist der von p1 kommt |