Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Variable aus Prozess abfragen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
09.03.2009, 11:16 Uhr
~Tallan
Gast


Hallo zusammen,

ich hab ein Programm in dem 2 Prozesse laufen und würde gerne 1 Variable die in Prozess 1 gesetzt wird in Prozess 2 Abfragen, ist das in der form möglich ?
Falls nein gibt es eine alternativ ?




Etwas detaillierter :

Im Kind läuft per system(command); ein programm das vom parent befehle erhält und ich würde gern anhand des returns von system testen ob der befehl ausgeführt wurde.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
09.03.2009, 19:47 Uhr
0xdeadbeef
Gott
(Operator)


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;
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
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
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
10.03.2009, 16:55 Uhr
0xdeadbeef
Gott
(Operator)


Hm. Also, wenn die Shell die Info nicht rausrückt, direkt von Prozess 1 da reinzukucken ist nicht möglich. Vielleicht solltest du der Shell nach jedem Befehl "echo $?" schicken, dann schreibt er dir den Rückgabewert auf stdout - dazu solltest du aber schon wissen, dass in Prozess 2 zu der Zeit auch eine Shell läuft.

Allerdings halte ich den ganzen Ansatz mit der Shell-Fernsteuerung für einen ziemlich dreckigen Hack, noch weit schlimmer als system zu benutzen, weil der Status der Shell über mehrere Befehle erhalten bleibt. Ich kann dir nur ans Herz legen, das ganze mit fork/exec aufzuziehen - du fährst damit sicherer und behältst mehr Kontrolle, unter anderem auch die, die Rückgabewerte der Kinder auszulesen. (Sofern sie welche haben)
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: