2012-03-25 2 views
1

Ich schreibe die folgenden Codes und führen Sie es in meinem Linux.Jede Zeit nach Gabel drucken die Terminals zwei PID, die zeigt beide Prozesse werden von der OS geplant, und dann ist es Zeit für "scanf" auszuführen, beide Prozesse sind blockiert warten für die Eingabe.Jedoch jedes Mal, wenn ich eine Nummer, und dann bekomme ich die gleiche PID auf dem Terminal gedruckt. Bedeutet dies, dass derselbe Prozess vom Betriebssystem aufgerufen wird, wenn sich ein Terminal IO trifft oder etwas anderes passiert?etwas über den Ablaufplan von OS?

int main(int argc, char* argv[]) 
{ 
    int num; 

    if(fork() >= 0) 
    { 
     printf("%x\n",getpid()); 
     while(1) 
     { 
      if(scanf("%d",&num) != EOF) 
      { 
      printf("%x\n",getpid()); 
      } 
     } 
    } 
    printf("\nit is over:%x\n", getpid()); 
} 
+0

Sie gruppieren den Testfall, ob Sie sich im übergeordneten Prozess und im untergeordneten Prozess befinden. 'fork()' gibt die PID des Kindprozesses an den Elternknoten (> 0) zurück und 'fork()' gibt 0 an das Kind zurück. –

Antwort

1

Wie Hunter McMillen bereits in Kommentaren notiert hat, gruppieren Sie die Fälle für Eltern und Kind. Nun werden beide wie von anderen PID s angegeben geplant und beide warten nun auf scanf. Sobald Sie Daten eingeben, sehen Sie nur noch eine PID, da die Eingabe, die Sie eingegeben haben, Teil eines Prozesses war. Andere Prozess (kann Eltern oder Kind sein) wartet immer noch auf die Eingabe von etwas. Nun, obwohl Ihr Terminal von einem einzelnen PID überflutet wird, der kontinuierlich von einem Prozess ausgegeben wird, versuchen Sie erneut, einige Daten einzugeben, und drücken Sie die Eingabetaste. Jetzt können Sie beide PID s gedruckt sehen!

+0

Egal wie oft ich Daten eingeben und Enter drücken, bekomme ich die gleiche PID auf dem Terminal gedruckt –

+0

@ venus.w Es ist nur ein Zufall, dass Sie sehen die gleiche PID. Auf meinem PC kann ich beide PIDs fast im gleichen Verhältnis sehen. Eine Sache machen. Geben Sie anstelle von 'scanf' eine Zahl ein und drücken Sie ENTER. 'scanf' wird verrückt und PID wird in einem Prozess unendlich gedruckt. Geben Sie erneut ein Zeichen ein und drücken Sie die Eingabetaste. Jetzt werden Sie sehen, dass beide PIDs unendlich herum schleichen –

+0

Ich führe mein Programm auf ubuntu, was ist Ihr Betriebssystem, vielleicht hängt es vom Betriebssystem ab. –

0

Dies liegt daran, in der if() Anweisung, fork() Kindprozess erstellt und läuft in einer Endlosschleife. Es gibt ein Konzept für den Parent-Prozess, den Parent des Child-Prozesses, der mit dem Systemaufruf fork() erstellt wurde. Die Anweisung nach dem Ende von if() gehört zum übergeordneten Prozess und wird erst nach dem Ende des untergeordneten Prozesses ausgeführt. Aus diesem Grund erhalten Sie die gleiche Prozess-ID, dh den untergeordneten Prozess.

+0

Es gibt kein 'Warten' hier. Also setzt der Elternteil seine Ausführung nach 'fork' fort und wartet nicht auf das Ende des Kinds, um seine Ausführung zu beginnen. Parent und Child werden unabhängig voneinander ausgeführt. Consult http://en.wikipedia.org/wiki/Fork_(Betriebssystem) –