Frage

Normalerweise, wenn ich in C blechen müssen, das tue ich etwas wie folgt aus:

pid_t p = fork();
if(p == 0) { /* do child stuff */ }
else { /* do parent stuff and pray there wasn't an error */ }

Es fiel mir auf, dass ich die zusätzliche Variable und Verwendung Graben könnte:

if(fork() == 0) { /* child */ }
else { /* parent/pray */ }

Eine falsche Fehlerbehandlung beiseite, (warum) funktionierts / nicht?

War es hilfreich?

Lösung

Was Sie vorschlagen sicher funktionieren. Allerdings ist die Fehlerbehandlung nicht optional in jeder gut erzogene Anwendung. Das folgende Implementierung Muster ist ähnlich prägnant und auch behandelt Fehler. Darüber hinaus spart die fork () Rückgabewert in der Variable pid, falls Sie es später in der Eltern verwenden möchten, sagen wir, für das Kind warten.

switch (pid = fork()) {
case -1:       /* Failure */
  /* ... */
case 0:        /* Child */
  /* ... */
default:       /* Parent */
  /* ... */
}

Andere Tipps

Sie verlieren die Kind Prozess-ID in den Eltern, das ist das, was die Mutterzurückgeführt wird. Ich denke, dass Sie diese Informationen erholen konnte, aber vielleicht nicht eindeutig (das heißt, ich glaube, Sie die PID alle Ihre Kinder bekommen konnte, aber nicht unbedingt die PID des Kindes einfach gegabelt). Wenn Sie das Kind die PID nicht wissen müssen, ich denke, die zweite Möglichkeit ist in Ordnung.

Auch -1 zurückgegeben, wenn es in Forking ein Fehler ist, die Sie in jedem Fall nicht den Zweck zu testen, die in der Regel ein Fehler.

Sie sollten dies tun, statt. Ich habe es nie bekannt, nicht zu arbeiten. Es ist, wie es in den Stevens Bücher gemacht hat.

int p;
if((p = fork()) == 0) { /* child */ }
else { /* parent/pray */ }

Sie sind frei, dass in C zu tun, und es wird funktionieren, weil die Eltern und Kind unterschiedliche Rückgabewerte von der Gabel erhalten - und es wird zuerst ausgewertet. Die einzigen Probleme sind die Fehlerbehandlung, wie Sie erwähnt. Außerdem werden Sie keine andere Möglichkeit haben, das Kind PID für den Fall erholen Sie darauf, wie mit einem waitpid, etc.

betreiben wollten
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top