Einen Zeiger an die main-Funktion übergeben
-
Geht das irgendwie? Der Hintergrund ist der folgende:
Ich starte innerhalb eines Programms einen Daemon D. Parallel wird ein anderes Programm P gestartet, welches die Dienste des Daemons benutzt. Nun muss dieses andere Programm P wissen, ob der Daemon D schon gestartet wurde. Dafür wollte ich dem Daemon D eine Adresse einer boolischen Variable übergeben, damit er diese nach dem Start auf true setzt. Diese Variable wird dann von dem P überprüft, und wenn sie true ist, macht P sein Zeug.
Wie könnte man sowas realisieren? Die main-Funktion interpretiert ja ihre Argumente als array von Zeichenfolgen argv[]. Ich habe mir sowas überlegt:
bool a = false;
bool* aPointer = &a;char buffer[11];
sprintf(buffer, "%p", aPointer);und dann den buffer übergeben. Aber wie hole ich denn die Adresse als zeigertyp aus dem buffer raus???
-
sprintf(buffer, "%x", aPointer);
-
Du kannst nicht einfach so nen Puffer über die main-Parameter an einen anderen Prozess übergeben.
-
Wie wärs statt dessen, wenn P von D gestartet würde ?
-
BorisDieKlinge schrieb:
sprintf(buffer, "%x", aPointer);
Wieso geht denn "%p" nicht? Ist doch ein Zeigerformat:
http://www.cplusplus.com/reference/clibrary/cstdio/printf.html
-
proggingmania schrieb:
Wie wärs statt dessen, wenn P von D gestartet würde ?
Nee, das entspricht nicht dem Sinn der Anwendung. Es sind zwei verschiedene Programme P und D und ich schreibe eine testsuite, die das Zusammenspiel automatisch testen soll. Also müssen die getrennt gestartet werden, sonst enspricht das nicht der Realität.
Es muss doch irgendwie gehen. Ich bin ja wohl nicht der Einzige, der sowas bewerkstelligen möchte

-
Die adressen des einen Prozesses sind innerhalb des anderen nicht gültig.
Du könntest es über eine named pipe oder sowas machen.
-
P schickt eine Nachricht an D und wartet bis TIMEOUT abgelaufen ist.
D empfängt Nachricht von P und sendet eine Antwort.
P empfängt Nachricht, das D bereit ist ...Kommunikationsmöglichkeiten sind Sockets, Pipes, Messages( z.B. PostMessage ), Umgebungsvariable etc.
Je nach Anwendungsfall.
-
The Solution schrieb:
P schickt eine Nachricht an D und wartet bis TIMEOUT abgelaufen ist.
D empfängt Nachricht von P und sendet eine Antwort.
P empfängt Nachricht, das D bereit ist ...Kommunikationsmöglichkeiten sind Sockets, Pipes, Messages( z.B. PostMessage ), Umgebungsvariable etc.
Je nach Anwendungsfall.Hi, danke. Es ist mir klar, dass ich sowas durchaus bewerkstelligen kann, indem ich die Prozesse P und D soweit verändere, dass sie miteinander Nachrichten austauschen können. Geht es denn auch irgendwie, ohne in die Prozesse an sich einzugreifen, ihren Quellcode zu verändern, also auf der höheren Ebene der Aufrufe?
-
Aber P so abändern, dass es wartet, bis eine Variable true ist ist ok, aber es so abändern, dass es wartet, bis es eine nachricht per Pipe, Socket, ... bekommt ist ein zu tiefer eingriff?
Im Grunde ist es doch das selbe.
-
Ewgenijkkg schrieb:
Hi, danke. Es ist mir klar, dass ich sowas durchaus bewerkstelligen kann, indem ich die Prozesse P und D soweit verändere, dass sie miteinander Nachrichten austauschen können.
Wieso verändern, die werden diesbezüglich von vornhereien so ausgelegt, konzipiert.

-
Helium schrieb:
Aber P so abändern, dass es wartet, bis eine Variable true ist ist ok, aber es so abändern, dass es wartet, bis es eine nachricht per Pipe, Socket, ... bekommt ist ein zu tiefer eingriff?
Im Grunde ist es doch das selbe.
Na ja, hast auch recht:) Thanks. Aber rein aus Interesse: gelten denn die Zeiger eines Prozesses in einem anderen grundsätzlich nicht, weil die verschiedene Adressräume haben, oder gibt es irgendwelche Tricks, um damit doch zu arbeiten?
-
Du kannst gern nen Zeiger an main übergeben, ist ja auch nur ne Zahl, die man konvertieren kann.
Du kannst aber nicht viel mit dem Zeiger anfangen, weil er für diesen Prozess nicht gültig ist, das hat Helium schon geschrieben.
-
Wie wärs mit einer ganz billigen Lösung uber eine Datei ?
Also, D ist erst dann bereit, wenn in einer Datei ein bestimmter Wert steht( z.B. TRUE ).Ansonsten:
http://en.wikipedia.org/wiki/Inter-process_communication
-
Ewgenijkkg schrieb:
Geht es denn auch irgendwie, ohne in die Prozesse an sich einzugreifen, ihren Quellcode zu verändern, also auf der höheren Ebene der Aufrufe?
Du willst doch nicht etwa Hacken, hm ?
-
Ewgenijkkg schrieb:
Geht es denn auch irgendwie, ohne in die Prozesse an sich einzugreifen, ihren Quellcode zu verändern, also auf der höheren Ebene der Aufrufe?
Guten Tag, ihren Ausweis bitte.