Zeichenverschiebung und Beendigungsabbruch
-
HI, ich bins wieder mit meinen kleinen Programmen
#include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <sys/wait.h> #include <sys/time.h> #include <sys/resource.h> int main (void) { pid_t pid,pid2; int menu; for (;;) { fprintf(stderr,"+------------------------------------------------------------------------+\n"); fprintf(stderr,"| %-70s |\n","[ 0] Beenden."); fprintf(stderr,"| %-70s |\n","[ 1] Erfragen der Prozess-ID (getpid)."); fprintf(stderr,"| %-70s |\n","[ 2] Erfragen der Elternprozess-ID (getppid)."); fprintf(stderr,"| %-70s |\n","[ 3] Erfragen der realen User-ID (getuid)."); fprintf(stderr,"| %-70s |\n","[ 4] Erfragen der effektiven User-ID (geteuid)."); fprintf(stderr,"| %-70s |\n","[ 5] Erfragen der realen Group-ID (getgid)."); fprintf(stderr,"| %-70s |\n","[ 6] Erfragen der effektiven Group-ID (getegid)."); fprintf(stderr,"| %-70s |\n","[ 7] Kreieren von neuen Prozessen (fork)."); fprintf(stderr,"| %-70s |\n","[ 8] Kreieren eines Prozesses mit anschliessendem exec-Aufruf (vfork)."); fprintf(stderr,"| %-70s |\n","[ 9] Warten auf Beendigung eines Prozesses (wait)."); fprintf(stderr,"| %-70s |\n","[10] Warten auf Beendigung eines Prozesses (waitpid)."); fprintf(stderr,"| %-70s |\n","[11] Warten auf Ende eines Prozesses, benutzte Ressourcen (wait3)."); fprintf(stderr,"| %-70s |\n","[12] Warten auf Ende eines Prozesses, benutzte Ressourcen (wait4)."); fprintf(stderr,"| %-70s |\n","[13] Die execl-Funktion ."); fprintf(stderr,"+------------------------------------------------------------------------+\n"); fprintf(stdout,"%s"," "); scanf("%d", &menu); if (menu == 0) { fprintf(stderr,"+------------------------------------------------------------------------+\n"); fprintf(stderr,"| %-70s |\n","Das Programm wird beendet!"); fprintf(stderr,"+------------------------------------------------------------------------+\n"); exit (0); } else if (menu == 1) { fprintf(stderr,"+------------------------------------------------------------------------+\n"); fprintf(stderr,"| %s : %-64d |\n","PID",getpid()); fprintf(stderr,"+------------------------------------------------------------------------+\n"); } else if (menu == 2) { fprintf(stderr,"+------------------------------------------------------------------------+\n"); fprintf(stderr,"| %s : %-63d |\n","PPID",getppid()); fprintf(stderr,"+------------------------------------------------------------------------+\n"); } else if (menu == 3) { fprintf(stderr,"+------------------------------------------------------------------------+\n"); fprintf(stderr,"| %s : %-63d |\n","UID",getuid()); fprintf(stderr,"+------------------------------------------------------------------------+\n"); } else if (menu == 4) { fprintf(stderr,"+------------------------------------------------------------------------+\n"); fprintf(stderr,"| %s : %-63d |\n","EUID",geteuid()); fprintf(stderr,"+------------------------------------------------------------------------+\n"); } else if (menu == 5) { fprintf(stderr,"+------------------------------------------------------------------------+\n"); fprintf(stderr,"| %s : %-63d |\n","GID",getgid()); fprintf(stderr,"+------------------------------------------------------------------------+\n"); } else if (menu == 6) { fprintf(stderr,"+------------------------------------------------------------------------+\n"); fprintf(stderr,"| %s : %-63d |\n","EGID",getegid()); fprintf(stderr,"+------------------------------------------------------------------------+\n"); } else if (menu = 7) { switch (pid = fork()) { case -1 : fprintf(stderr,"+------------------------------------------------------------------------+\n"); fprintf(stderr,"| %-63d |\n","Fehler bei fork()"); fprintf(stderr,"+------------------------------------------------------------------------+\n"); break; case 0 : fprintf(stderr,"+------------------------------------------------------------------------+\n"); fprintf(stderr,"| %s : %-55d |\n","Kindprozess",pid); fprintf(stderr,"+------------------------------------------------------------------------+\n"); break; default : fprintf(stderr,"+------------------------------------------------------------------------+\n"); fprintf(stderr,"| %s : %-54d |\n","Elternprozess",pid); fprintf(stderr,"+------------------------------------------------------------------------+\n"); break; } } else if (menu == 8) { switch (pid2 = vfork()) { case -1 : fprintf(stderr,"+------------------------------------------------------------------------+\n"); fprintf(stderr,"| %-63d |\n","Fehler bei vfork()"); fprintf(stderr,"+------------------------------------------------------------------------+\n"); break; case 0 : fprintf(stderr,"+------------------------------------------------------------------------+\n"); fprintf(stderr,"| %s : %-55d |\n","Kindprozess",pid2); fprintf(stderr,"+------------------------------------------------------------------------+\n"); break; default : fprintf(stderr,"+------------------------------------------------------------------------+\n"); fprintf(stderr,"| %s : %-54d |\n","Elternprozess",pid2); fprintf(stderr,"+------------------------------------------------------------------------+\n"); break; } } else if (menu == 9) { fprintf(stderr,"+------------------------------------------------------------------------+\n"); int status; pid2 = fork(); if (wait (&status) != pid2) printf("Fehler\n"); if (WIFEXITED(status)) { printf("Normale Beendigung: exit-Status = %d\n",WEXITSTATUS(status)); } else if (WIFSIGNALED(status)) { printf("Abnormale Beendigung: exit-Status = %d\n",WTERMSIG(status)); } else if (WIFSTOPPED(status)) { printf("Prozess wurde angehalten: exit-Status = %d\n",WSTOPSIG(status)); } else printf("Fehler"); fprintf(stderr,"+------------------------------------------------------------------------+\n"); } else if (menu == 10) { int status2; pid_t pid3; switch (pid3 = fork()) { case -1 : printf("Fehler bei fork"); break; case 0 : fprintf(stderr,"+------------------------------------------------------------------------+\n"); fprintf(stderr,"| %-63d |\n","Kindprozess: %d\n",getpid()); fprintf(stderr,"+------------------------------------------------------------------------+\n"); exit(0); default : fprintf(stderr,"+------------------------------------------------------------------------+\n"); fprintf(stderr,"| %-63d |\n","Elternprozess: %d\n",getppid()); fprintf(stderr,"+------------------------------------------------------------------------+\n"); break; } if (pid3 == -1) printf("Auf Beendingung eines beliebigen Kindprozess warten\n"); else if (pid3 > 0) printf("Auf Beendigung des Kindprozess mit der Prozess-ID pid warten\n"); else if (pid3 == 0) printf("Auf Beendingung eines Kindprozess warten...\n"); else if (pid3 < -1) printf("Auf Beendingung eines Kindprozess warten...\n"); if (waitpid (pid3, NULL, WNOHANG) != 0) printf("Fehler"); } else if (menu == 11) { int status3; pid_t pid4; switch (pid4 = fork()) { case -1 : printf("Fehler bei fork"); break; case 0 : fprintf(stderr,"+------------------------------------------------------------------------+\n"); fprintf(stderr,"| %-63d |\n","Kindprozess: %d\n",getpid()); fprintf(stderr,"+------------------------------------------------------------------------+\n"); exit(0); default : fprintf(stderr,"+------------------------------------------------------------------------+\n"); fprintf(stderr,"| %-63d |\n","Elternprozess: %d\n",getppid()); fprintf(stderr,"+------------------------------------------------------------------------+\n"); break; } if (wait3 (NULL,WNOHANG,0) != 0) printf("Fehler"); } else if (menu == 12) { int status3; pid_t pid5; switch (pid5 = fork()) { case -1 : printf("Fehler bei fork"); break; case 0 : fprintf(stderr,"+------------------------------------------------------------------------+\n"); fprintf(stderr,"| %-63d |\n","Kindprozess: %d\n",getpid()); fprintf(stderr,"+------------------------------------------------------------------------+\n"); exit(0); default : fprintf(stderr,"+------------------------------------------------------------------------+\n"); fprintf(stderr,"| %-63d |\n","Elternprozess: %d\n",getppid()); fprintf(stderr,"+------------------------------------------------------------------------+\n");exit(0); } if (wait4 (pid5,NULL,WNOHANG,0) != 0) printf("Fehler"); } else if (menu == 13) { if (execl("/bin/ls",NULL) ) printf("Fehler"); } else { fprintf(stderr,"+------------------------------------------------------------------------+\n"); fprintf(stderr,"| %-63d |\n","Programm wird beendet"); exit(0); fprintf(stderr,"+------------------------------------------------------------------------+\n"); } } return 0; }
Wenn ich 11 oder 12 mache kommt die obere Linie ein Zeichen nach rechts und wenn ich danach beenden will, gibt er schon aus nur er beendet nicht.
Vielen Dank!
PS"Wenn Ihr wollt könnt ihr es auch nach Fehlern durchchecken"
-
[JustJoking]Macht man das eigentlich unter Linux so, alles nach stderr auszugeben (?) oder siehst du dein ganzes Programm als einen einzigen großen Fehler an?[/JustJoking]
Ne, im Ernst: Formatier's doch mal anständig.
Greetz, Swordfish
-
fork() erzeugt zwei eigenständige Threads, die weitgehend unabhängig voneinander weiterlaufen - du solltest vermutlich verhindern, daß der Kindprozess in die Haupteingabeschleife zurückkehren kann.
PS: Deine Einrückung ist katastrophal, daß du da nicht den Überblick verlierst wundert mich sehr.
PPS: Befehle hinter dem break (im switch-case-Block) sind übrigens sinnlos - da kommt das Programm sowieso nicht hin.
-
CStoll schrieb:
fork() erzeugt zwei eigenständige Threads, die weitgehend unabhängig voneinander weiterlaufen - du solltest vermutlich verhindern, daß der Kindprozess in die Haupteingabeschleife zurückkehren kann.
Was meinst du genau? Hmm, da ich weiss dass du dich besser auskennst als ich sag ich mal "Kannst du mir das genauer erklären?"
CStoll schrieb:
PS: Deine Einrückung ist katastrophal, daß du da nicht den Überblick verlierst wundert mich sehr.
Naja, ich machs ja noch aber ich komm zu recht
Ich machs wenn es fertig ist.
Ne, im Ernst: Formatier's doch mal anständig.
Ich mach alles nach einem Buch und ich denke das ist schon richtig so, sonst würde CStoll schon meckern
-
fork() dupliziert den prozess, nicht den thread.
-
maximo schrieb:
CStoll schrieb:
fork() erzeugt zwei eigenständige Threads, die weitgehend unabhängig voneinander weiterlaufen - du solltest vermutlich verhindern, daß der Kindprozess in die Haupteingabeschleife zurückkehren kann.
Was meinst du genau? Hmm, da ich weiss dass du dich besser auskennst als ich sag ich mal "Kannst du mir das genauer erklären?"
OK, die Kurzfassung: Nach dem fork()-Aufruf laufen zwei Ausgaben deines Programmes parallel zueinander. Und das schnellere bekommt jeweils die nächste Eingabe.
(und bei dir landen nach der Auswertung beide Prozesse wieder in der Hauptabfrage - der erste erhält die Antwort 0 (beenden), der zweite wartet weiter)Als Lösung müsstest du am besten verhindern, daß der Kindprozess (jeweils der "case 0:" Zweig wieder in die Hauptschleife zurückkehrt, z.B. indem du ihn per exit() verlässt.
PS: Ja, du kommst mit der Einrückung vielleicht zurecht - aber hier wollen auch andere mitlesen. Und ich hab' nicht wirklich Lust, mich durch dieses Gewühl an Klammern und Verschachtelungen durchzukauen.
-
CStoll schrieb:
PS: Ja, du kommst mit der Einrückung vielleicht zurecht - aber hier wollen auch andere mitlesen. Und ich hab' nicht wirklich Lust, mich durch dieses Gewühl an Klammern und Verschachtelungen durchzukauen.
Aha! Ich verstehe! Beim nächsten mal wird's besser.
Und irgendwie hat das nicht viel geholfen
siehe obenIch hoffe die Einrückung ist jetzt besser?
Soo, ich habe jetzt Menu == 13 gemacht und ich krieg nur Elternprozess raus, wo ich es doch garnicht gewollt habe.
Kannst du mir das bitte erklären?Vielen Dank!
Edit: Schade dass mir keiner antwortet, da ich aber Hilfe brauche