ein fork() Klausurfrage

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • ein fork() Klausurfrage

    Abend,

    ich habe hier eine Klausurfrage und kann mir leider die Antwort nicht erklären.

    Quellcode

    1. #include <stdio.h>
    2. #include <unistd.h>
    3. //#include <stdlib.h>
    4. int main(int argc,char *argv[]){
    5. int i;
    6. printf("wo ist das printf");
    7. printf("PID%d",getpid());
    8. for(i = 0; i < 4; i++){
    9. fork();
    10. while(1);
    11. }
    12. return 0;
    13. }
    Alles anzeigen


    Nun die Frage: Wieviele Prozesse laufen auf dem Rechner, nachdem sie alle die Endlosschleife erreicht haben?
    Frage b): Verschieben sie die Endlosschleife hinter die FOR-Schleife und beantworten Sie die gleiche Frage wie in a);

    Beim A ist die Lösung 2 das habe ich kapiert. Aber die Lösung von B ist mir unerklärlich ( 8 )...
    Wieso werden die print-Befehle nicht ausgegeben?

    Bitte um Hilfe
  • Also warum da 8 rauskommen soll kann ich dir nicht erklären, ich hab den Code mal getestet und bei mir kommen 16 Prozesse raus (das deckt sich auch mit meiner Erwartung).
    Überleg dir einfach mal was der fork befehl macht und was dann in jedem einzelnen Prozess passiert.

    Das printf funktioniert nicht, weil die Ausgaben von printf gebuffert werden und erst ausgegeben wenn ein newline in stdout geschrieben wird. Da bei deinen printfs kein newline vorkommt, wird es deswegen nicht direkt ausgegeben. Würde das Programm zuende laufen würde es dann auch ausgegeben, da du aber ne endlosschleife hast kommt es nie so weit. Einfach mal das while(1) ganz rauslassen und du wirst sehen, dass die ausgabe erscheint.
  • Rondrer schrieb:

    Also warum da 8 rauskommen soll kann ich dir nicht erklären, ich hab den Code mal getestet und bei mir kommen 16 Prozesse raus (das deckt sich auch mit meiner Erwartung).
    Überleg dir einfach mal was der fork befehl macht und was dann in jedem einzelnen Prozess passiert.

    Das printf funktioniert nicht, weil die Ausgaben von printf gebuffert werden und erst ausgegeben wenn ein newline in stdout geschrieben wird. Da bei deinen printfs kein newline vorkommt, wird es deswegen nicht direkt ausgegeben. Würde das Programm zuende laufen würde es dann auch ausgegeben, da du aber ne endlosschleife hast kommt es nie so weit. Einfach mal das while(1) ganz rauslassen und du wirst sehen, dass die ausgabe erscheint.


    Ja, entschuldige. Ich habe bisschen herumprobiert. Ich habe die Schleife geändert. In der Klausur stand dort i < 3.
    Werde jetzt mal der Beschreibung von Spider nachgehen, danke soweit.
    Ich hoffe ich verstehe das jetzt..

    PS: natürlich gibt es mit \n nun endlich auch eine Ausgabe
  • Denke aber dass das nicht ganz richtig ist. 4+3+2+1 ist ja nicht 8 sondern 10 ;) Abgesehen davon käme bei i < 3 ja 1+2+3 = 6 raus.

    Es ist ja so, dass ein fork ne exakte Kopie des Prozesses erstellt und dann beide im gleichen zustand weiterlaufen. Das bedeutet beim ersten Schleifendurchlauf werden aus dem einen Prozess zwei Prozesse.
    Beim nächsten Schleifendurchlauf erstellt JEDER dieser Prozesse wieder ne Kopie von sich, also sind es dann schon vier. So geht das dann weiter und in jedem Schleifendurchlauf verdoppelt sich die prozessanzahl, daher ist die Anzahl der Prozesse für i<3 2^3 = 8 und für i<4 2^4= 16
  • Rondrer schrieb:

    Denke aber dass das nicht ganz richtig ist. 4+3+2+1 ist ja nicht 8 sondern 10 ;) Abgesehen davon käme bei i < 3 ja 1+2+3 = 6 raus.

    Es ist ja so, dass ein fork ne exakte Kopie des Prozesses erstellt und dann beide im gleichen zustand weiterlaufen. Das bedeutet beim ersten Schleifendurchlauf werden aus dem einen Prozess zwei Prozesse.
    Beim nächsten Schleifendurchlauf erstellt JEDER dieser Prozesse wieder ne Kopie von sich, also sind es dann schon vier. So geht das dann weiter und in jedem Schleifendurchlauf verdoppelt sich die prozessanzahl, daher ist die Anzahl der Prozesse für i<3 2^3 = 8 und für i<4 2^4= 16


    Ahh, gut.
    Kleiner Widerspruch in deiner Aussage. Aber die unteren Angaben sind korrekt. Danke für die Hilfe ich kam einach incht darauf das die Schleife dann schon weiter gezählt wird.
    Danke vielmals.
    Super jetzt ist es nicht mehr schwer zu verstehen, vergiss das mit dem Widerspruch habe deine Aussage nun auch kapiert.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Tetris ()