2 Stimmen

Erstellen eines neuen unabhängigen Prozesses aus einem anderen C-Prozess

Es existieren zwei ausführbare C-Programme A und B. A und B kommunizieren miteinander über einen Socket.

B kann unabhängig oder über A gestartet werden.

  1. Wenn zuerst B und dann A gestartet wird, starten A und B ordnungsgemäß und ohne Probleme. Auch wenn A neu gestartet wird, gibt es keine Probleme.

  2. Wenn B durch A gestartet wird, dann starten A und B richtig. Aber hier ist der Kommunikationsanschluss sowohl an A als auch an B gebunden. Wenn A neu gestartet wird, kann A nicht gestartet werden.

Da B durch A gestartet wird, ist Prozess A der Elternteil von Prozess B.

Gibt es also eine Möglichkeit, den Prozess B unabhängig von Prozess A zu starten?

Wir haben versucht, fork zu verwenden, aber mit fork werden beim Versuch, die Exe zu starten, zwei Prozesse anstelle von einem gestartet.

3voto

Harper Shelby Punkte 16295

Haben Sie versucht, eine "Wrapper"-Programmdatei zu verwenden, die sich zweimal verzweigt - einmal für A und einmal für B - und sich dann selbst löscht? Damit wären A und B als separate Prozesse am Leben, die dann vom Init-Prozess geerbt werden, und sollten sicher wieder gestartet werden können.

0voto

FelipeC Punkte 7866

Sind Sie sicher, dass Sie den Rückgabewert von fork() ?

Wie:

pid_t pid;
if (pid == 0) {
    /* child */
}
else if (pid > 0) {
    /* parent */
}
else {
    /* error */
}

0voto

Jonathan Leffler Punkte 694013

Verwenden Sie einen Unix-Domain-Socket oder einen normalen Netzwerk-Socket?

Welcher der Prozesse, A oder B, lauscht auf dem Socket (passives Öffnen), und welcher öffnet ihn aktiv?

Wenn Sie entscheiden, dass A B ausführen soll, wie bestimmt der Code, dass dies notwendig ist?

Öffnen Sie den Socket, bevor Sie forken und ausführen?

Mein Eindruck nach den gegebenen Informationen ist:

  • Sie verwenden eine Netzwerkbuchse
  • B ist der Zuhörer

Aber ich könnte mich leicht irren.

Ich frage mich, ob Sie Probleme bekommen, weil A den aktiven Socket bereits erstellt hat, bevor Sie sich gabeln und B ausführen, so dass das aktive Ende des Sockets nicht sauber geschlossen wird, wenn A beendet wird, weil B eine Kopie des Sockets zum Schreiben geöffnet hat, ebenso wie A. Wenn Sie sich gabeln, sollte der Kindprozess nicht benötigte Dateideskriptoren (wie Sockets) aufräumen, bevor ein anderer Prozess ausgeführt wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X