8 Stimmen

fork() untergeordnete und übergeordnete Prozesse

Ich versuche, ein Programm zu erstellen, das fork() verwendet, um einen neuen Prozess zu erstellen. Die Beispielausgabe sollte wie folgt aussehen:

Dies ist der Prozess des Kindes. Meine PID ist 733 und die ID meines Elternteils ist 772.
Dies ist der übergeordnete Prozess. Meine pid ist 772 und die id meines Childs ist 773.

So habe ich mein Programm programmiert:

#include <stdio.h>
#include <stdlib.h>

int main() {
    printf("This is the child process. My pid is %d and my parent's id is %d.\n", getpid(), fork());

    return 0;
}

Das Ergebnis ist die Ausgabe:

Dies ist der Prozess des Kindes. Meine PID ist 22163 und die ID meines Elternteils ist 0.
Dies ist der Prozess des Kindes. Meine PID ist 22162 und die ID meines Elternteils ist 22163.

Warum wird die Anweisung zweimal gedruckt, und wie kann ich erreichen, dass die ID des Elternteils richtig angezeigt wird, nachdem die ID des Kindes im ersten Satz angezeigt wurde?

EDITAR:

#include <stdio.h>
#include <stdlib.h>

int main() {
int pid = fork();

if (pid == 0) {
    printf("This is the child process. My pid is %d and my parent's id is %d.\n", getpid(), getppid());
}
else {
    printf("This is the parent process. My pid is %d and my parent's id is %d.\n", getpid(), pid);
}

return 0;
}

16voto

Tom Punkte 41522

Beginnen Sie mit der Lektüre der fork man-Seite sowie die getppid / getpid man-Seiten.

Von Fork's

Bei Erfolg wird die PID des Kindprozesses zurückgegeben Ausführungsthread zurückgegeben, und im Thread des Kindprozesses wird eine 0 zurückgegeben Ausführung zurückgegeben. Bei einem Fehlschlag wird im Kontext des Elternprozesses eine -1 zurückgegeben, wird kein Kindprozess erstellt und errno wird entsprechend gesetzt.

Dies sollte also in etwa so aussehen

if ((pid=fork())==0){
    printf("yada yada %u and yada yada %u",getpid(),getppid());
}
else{ /* avoids error checking*/
    printf("Dont yada yada me, im your parent with pid %u ", getpid());
}

Zu Ihrer Frage:

Dies ist der Prozess des Kindes. Meine PID ist 22163 und die ID meines Elternteils ist 0.

Dies ist der Prozess des Kindes. Meine PID ist 22162 und die ID meines Elternteils ist 22163.

fork() wird vor der Ausführung der printf . Wenn das erledigt ist, haben Sie zwei Prozesse mit denselben Anweisungen, die ausgeführt werden müssen. Daher wird printf zweimal ausgeführt. Der Aufruf von fork() wird zurückgegeben 0 an den Kindprozess, und die pid des Kindprozesses an den Elternprozess.

Sie erhalten zwei laufende Prozesse, von denen jeder Folgendes ausführen wird Anleitung Erklärung:

printf ("... My pid is %d and my parent's id is %d",getpid(),0); 

et

printf ("... My pid is %d and my parent's id is %d",getpid(),22163);  

~

Die obige Zeile ist also das Kind, das seine pid . Die zweite Zeile ist der übergeordnete Prozess, der seine ID (22162) und die des untergeordneten Prozesses (22163) angibt.

2voto

Hogan Punkte 65759

Die Anweisung wird zweimal gedruckt, da sie sowohl für den Elternteil als auch für das Kind gedruckt wird. Das Elternteil hat eine Eltern-ID von 0

Versuchen Sie so etwas:

 pid_t  pid;
 pid = fork();
 if (pid == 0) 
    printf("This is the child process. My pid is %d and my parent's id is %d.\n", getpid(),getppid());
 else 
    printf("This is the parent process. My pid is %d and my parent's id is %d.\n", getpid(), getppid() );

2voto

Muhammad Awais Punkte 149

Wir steuern den Aufruf des fork()-Prozesses durch die if- und else-Anweisung. Siehe meinen Code unten:

int main()
{
   int forkresult, parent_ID;

   forkresult=fork();
   if(forkresult !=0 )
   {
        printf(" I am the parent my ID is = %d" , getpid());
        printf(" and my child ID is = %d\n" , forkresult);
   }
   parent_ID = getpid();

   if(forkresult ==0)
      printf(" I am the  child ID is = %d",getpid());
   else
      printf(" and my parent ID is = %d", parent_ID);
}

0voto

Daniel Pereira Punkte 1767

Es wird zweimal gedruckt, weil Sie printf zweimal aufrufen, einmal bei der Ausführung Ihres Programms und einmal im Fork. Versuchen Sie, Ihren fork() aus dem printf-Aufruf herauszunehmen.

0voto

Nitish Jain Punkte 694

Dies ist der richtige Weg, um die richtige Ausgabe zu erhalten.... Es kann jedoch vorkommen, dass die Eltern-ID der Kinder als 1 ausgegeben wird, weil der Elternprozess beendet wird und der Root-Prozess mit pid = 1 diesen verwaisten Prozess kontrolliert.

 pid_t  pid;
 pid = fork();
 if (pid == 0) 
    printf("This is the child process. My pid is %d and my parent's id 
      is %d.\n", getpid(), getppid());
 else 
     printf("This is the parent process. My pid is %d and my parent's 
         id is %d.\n", getpid(), pid);

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