fork() zusammen mit exit()? < C/C++ < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 19:30 Di 08.11.2011 | Autor: | bandchef |
Aufgabe | Was macht hier exit()? |
Hey Leute!
Ich hab folgenden C-Code:
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
int pid, i, j;
pid = fork();
if(pid == 0)
{
for(i=0; i<10; i++)
{
printf("Kindprozess: %d (PID: %d) [mm] \n", [/mm] i, getpid()); //getpid() -> liefert die PID des aufrufenden Prozesses zurück
sleep(1); //sleep() -> stoppt den aufrufenden Prozess so lange, wie es in der Klammer (Sekunden) steht
}
exit(1); //exit() ->
}
else if(pid > 0)
{
for(j=0; j<10; j++)
{
printf("Vaterprozess: %d (PID: %d) [mm] \n", [/mm] j, getpid());
sleep(1);
}
}
else
{
printf("Fehler!");
exit(1); //exit() ->
}
return 0;
}
Wenn ich nun das Programm aufrufe sieht man wie das OS die zwei Prozesse abarbeitet. Was mir nicht klar ist, was das exit() machen soll. Wenn ich mir zu exit() die Linux-manpage anschaue, dann wird nur ein Fall erklät für exit(3). Für die beiden Fälle die ich hier hab nämlich exit(0) und exit(1) hab ich leider nichts gefunden. Wenn ich die Zahlen in den Klammern ändere, verändert sich bei der Ausgabe auch nichts. Irgendwie versteh ich das nicht so ganz. Könnt ihr mir dazu helfen?
|
|
|
|
Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
Hallo bandchef,
> Was macht hier exit()?
> Hey Leute!
>
> Ich hab folgenden C-Code:
>
> #include<stdio.h>
> #include<unistd.h>
> #include<stdlib.h>
>
> int main()
> {
> int pid, i, j;
>
> pid = fork();
>
>
> if(pid == 0)
> {
> for(i=0; i<10; i++)
> {
> printf("Kindprozess: %d (PID: %d) [mm]\n",[/mm]Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
i,
> getpid()); //getpid() -> liefert die PID des aufrufenden
> Prozesses zurück
> sleep(1); //sleep() -> stoppt den
> aufrufenden Prozess so lange, wie es in der Klammer
> (Sekunden) steht
> }
>
> exit(1); //exit() ->
> }
> else if(pid > 0)
> {
> for(j=0; j<10; j++)
> {
> printf("Vaterprozess: %d (PID: %d) [mm]\n",[/mm]Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
j,
> getpid());
> sleep(1);
> }
> }
> else
> {
> printf("Fehler!");
> exit(1); //exit() ->
> }
>
> return 0;
> }
>
>
>
> Wenn ich nun das Programm aufrufe sieht man wie das OS die
> zwei Prozesse abarbeitet. Was mir nicht klar ist, was das
> exit() machen soll. Wenn ich mir zu exit() die
> Linux-manpage anschaue, dann wird nur ein Fall erklät für
> exit(3). Für die beiden Fälle die ich hier hab nämlich
> exit(0) und exit(1) hab ich leider nichts gefunden. Wenn
> ich die Zahlen in den Klammern ändere, verändert sich bei
> der Ausgabe auch nichts. Irgendwie versteh ich das nicht so
> ganz. Könnt ihr mir dazu helfen?
>
Der Befehl "exit()" gibt einen Rückkehrcode an die aufrufende Umgebung zurück.
Ein Rückkehrcode von 0 bedeutet das Progamm wurde ohne Fehler beendet.
Ein von 0 verschiedener Wert bedeutet, das Programm wurde mit einem Fehler beendet.
Gruss
MathePower
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 20:24 Di 08.11.2011 | Autor: | bandchef |
Danke für die Antwort!
Zitat: "Ein Rückkehrcode von 0 bedeutet das Progamm wurde ohne Fehler beendet.
Ein von 0 verschiedener Wert bedeutet, das Programm wurde mit einem Fehler beendet."
Wenn ich jetzt z.B schreiben würde "var = exit();" und das Programm fehlerfrei beendet wurde, dann schreibt mir exit() eine 0 in var. Wenn das Programm nicht korrekt beendet wurde, dann schreibt mir exit() einen von 0 verschiedenen Wert in var. Soweit ist alles klar.
Aber: Was bedeutet die Zahl innerhalb der Klammer des Systemaufrufs "exit()"?
-> Könnte man sagen, exit() ist ähnlich dem return (welches ja aus Funktionen bestimmte Werte zurückliefern kann...), nur, dass sich das exit() auf die aufrufende Umgebung zurückbbezieht und aus dem aufgerufenen Prozess einen entsprechenden Wert zurückliefert?
|
|
|
|
|
Hallo bandchef,
> Danke für die Antwort!
>
> Zitat: "Ein Rückkehrcode von 0 bedeutet das Progamm wurde
> ohne Fehler beendet.
> Ein von 0 verschiedener Wert bedeutet, das Programm wurde
> mit einem Fehler beendet."
>
> Wenn ich jetzt z.B schreiben würde "var = exit();" und das
> Programm fehlerfrei beendet wurde, dann schreibt mir exit()
> eine 0 in var. Wenn das Programm nicht korrekt beendet
Dann erhältst Du möglicherweise eine Fehlermeldung Compiler,
da exit() den Rückgabetype void hat und somit nichts zurückliefert.
> wurde, dann schreibt mir exit() einen von 0 verschiedenen
> Wert in var. Soweit ist alles klar.
>
> Aber: Was bedeutet die Zahl innerhalb der Klammer des
> Systemaufrufs "exit()"?
>
Das habe ich schon erläutert.
>
> -> Könnte man sagen, exit() ist ähnlich dem return
> (welches ja aus Funktionen bestimmte Werte zurückliefern
> kann...), nur, dass sich das exit() auf die aufrufende
> Umgebung zurückbbezieht und aus dem aufgerufenen Prozess
> einen entsprechenden Wert zurückliefert?
"exit" beendet das gesamte Programm.
Gruss
MathePower
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 21:05 Di 08.11.2011 | Autor: | bandchef |
Gut, wenn ich nun exit(0) stehen hab, dann verstehe ich nicht wie ich quasi bei der Programmierung schon wissen soll ob ein Fehler da ist oder nicht?
Ich hab gedacht, dass exit() einen Wert zurückliefert...; so müsste ich mir quasi vorher schon aussuchen ob das Programm richtig ist oder nich... Versteh ich nicht.
Kannst du das nochmal ausführlicher und für gaaanz Dumme erklären?
|
|
|
|
|
Hallo bandchef,
> Gut, wenn ich nun exit(0) stehen hab, dann verstehe ich
> nicht wie ich quasi bei der Programmierung schon wissen
> soll ob ein Fehler da ist oder nicht?
>
Ob das Programm bei Abbruch einen Fehler liefert oder nicht,
liegt in Deinem Ermessen, d.h. das wird von Dir gesteuert.
> Ich hab gedacht, dass exit() einen Wert zurückliefert...;
> so müsste ich mir quasi vorher schon aussuchen ob das
> Programm richtig ist oder nich... Versteh ich nicht.
>
> Kannst du das nochmal ausführlicher und für gaaanz Dumme
> erklären?
"exit" liefert keinen Wert zurück, da der Rückgabetyp "void"
das nicht zulässt.
Dem Befehl "exit()" kannst Du einen Wert mitgeben,
der dann von der aufrufenden Umgebung (in Linux i.d.R. die Shell)
abgefragt werden kann.
Gruss
MathePower
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 21:20 Di 08.11.2011 | Autor: | bandchef |
Aber was für einen Sinn macht das, dass ich der Funktion exit() in die Klammer reinschreiben muss ob das Programm richtig ausgeführt wurde oder nicht. Man kann doch vor Programmausführung noch gar nicht wissen, ob dann zur Laufzeit alles im Programm passt!
Beispiel: Das Programm wurde richtig ausgeführt, ich schreib aber z.B. exit(1), dann wäre quasi das Programm falsch ausgeführt worden, obwohl es doch richtig ist!
Versteh ich einfach nicht...
|
|
|
|
|
Hallo bandchef,
> Aber was für einen Sinn macht das, dass ich der Funktion
> exit() in die Klammer reinschreiben muss ob das Programm
> richtig ausgeführt wurde oder nicht. Man kann doch vor
> Programmausführung noch gar nicht wissen, ob dann zur
> Laufzeit alles im Programm passt!
>
Das hat damit nichts zu tun.
Wenn Du ein Programm schreibst, das z.B. eine bestimmte Anzahl
von Argumenten erwartet. und das Programm wird mit einer falschen
Anzahl von Parametern aufgerufen, dann solltest Du diesen Fall
in dem Programm berücksichtigen und dann einen entsprechenden
Fehlercode liefern. Im Hauptprogramm main hat exit dieselbe Wirkung
wie return.
> Beispiel: Das Programm wurde richtig ausgeführt, ich
> schreib aber z.B. exit(1), dann wäre quasi das Programm
> falsch ausgeführt worden, obwohl es doch richtig ist!
>
> Versteh ich einfach nicht...
Gruss
MathePower
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 21:10 Di 08.11.2011 | Autor: | felixf |
Moin!
> Wenn ich nun das Programm aufrufe sieht man wie das OS die
> zwei Prozesse abarbeitet. Was mir nicht klar ist, was das
> exit() machen soll. Wenn ich mir zu exit() die
> Linux-manpage anschaue, dann wird nur ein Fall erklät für
> exit(3). Für die beiden Fälle die ich hier hab nämlich
> exit(0) und exit(1) hab ich leider nichts gefunden. Wenn
Beachte bitte, dass das "EXIT(3)" ganz oben bei "man exit" sagt, dass du in Kapitel 3 des Handbuchs im Abschnitt "EXIT" bist. Das hat nichts mit dem Befehl "exit(3)" zu tun, wo der Funktion "exit" der Parameter 3 uebergeben wird.
LG Felix
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 21:18 Di 08.11.2011 | Autor: | bandchef |
Ok; das erklärt einiges
Aber, was darf ich denn dann überhaupt in die Klammern schreiben? Das heißt also, exit() liefert einen vom Programmstatus abhängig Parameter zurück, der verschieden von 0 wird, wenn das Programm falsch lief und der 0 wird wenn das Programm richtig beendet wurde.
Soweit korrekt?
|
|
|
|
|
Hallo bandchef,
> Ok; das erklärt einiges
>
> Aber, was darf ich denn dann überhaupt in die Klammern
> schreiben? Das heißt also, exit() liefert einen vom
> Programmstatus abhängig Parameter zurück, der verschieden
> von 0 wird, wenn das Programm falsch lief und der 0 wird
> wenn das Programm richtig beendet wurde.
>
> Soweit korrekt?
Ja.
Gruss
MathePower
|
|
|
|
|
Hallo!
Du kannst dir ne Tabelle ausdenken, welche zahl für welchen Fehlerfall stehen soll.
Das hängt auch davon ab, ob der genaue Grund für ein aufrufendes Programm überhaupt interessant ist, oder nicht. Meistens reicht ja die Info, ob alles OK war, oder nicht.
Als Konvention gibt man dann standardmäßig -1 zurück. Das besteht binär nur aus Einsen.
|
|
|
|