matheraum.de
Raum für Mathematik
Offene Informations- und Nachhilfegemeinschaft

Für Schüler, Studenten, Lehrer, Mathematik-Interessierte.
Hallo Gast!einloggen | registrieren ]
Startseite · Forum · Wissen · Kurse · Mitglieder · Team · Impressum
Forenbaum
^ Forenbaum
Status Mathe
  Status Schulmathe
    Status Primarstufe
    Status Mathe Klassen 5-7
    Status Mathe Klassen 8-10
    Status Oberstufenmathe
    Status Mathe-Wettbewerbe
    Status Sonstiges
  Status Hochschulmathe
    Status Uni-Analysis
    Status Uni-Lin. Algebra
    Status Algebra+Zahlentheo.
    Status Diskrete Mathematik
    Status Fachdidaktik
    Status Finanz+Versicherung
    Status Logik+Mengenlehre
    Status Numerik
    Status Uni-Stochastik
    Status Topologie+Geometrie
    Status Uni-Sonstiges
  Status Mathe-Vorkurse
    Status Organisatorisches
    Status Schule
    Status Universität
  Status Mathe-Software
    Status Derive
    Status DynaGeo
    Status FunkyPlot
    Status GeoGebra
    Status LaTeX
    Status Maple
    Status MathCad
    Status Mathematica
    Status Matlab
    Status Maxima
    Status MuPad
    Status Taschenrechner

Gezeigt werden alle Foren bis zur Tiefe 2

Navigation
 Startseite...
 Neuerdings beta neu
 Forum...
 vorwissen...
 vorkurse...
 Werkzeuge...
 Nachhilfevermittlung beta...
 Online-Spiele beta
 Suchen
 Verein...
 Impressum
Das Projekt
Server und Internetanbindung werden durch Spenden finanziert.
Organisiert wird das Projekt von unserem Koordinatorenteam.
Hunderte Mitglieder helfen ehrenamtlich in unseren moderierten Foren.
Anbieter der Seite ist der gemeinnützige Verein "Vorhilfe.de e.V.".
Partnerseiten
Dt. Schulen im Ausland: Mathe-Seiten:Weitere Fächer:

Open Source FunktionenplotterFunkyPlot: Kostenloser und quelloffener Funktionenplotter für Linux und andere Betriebssysteme
StartseiteMatheForenC/C++fork() zusammen mit exit()?
Foren für weitere Schulfächer findest Du auf www.vorhilfe.de z.B. Philosophie • Religion • Kunst • Musik • Sport • Pädagogik
Forum "C/C++" - fork() zusammen mit exit()?
fork() zusammen mit exit()? < C/C++ < Programmiersprachen < Praxis < Informatik < Vorhilfe
Ansicht: [ geschachtelt ] | ^ Forum "C/C++"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien

fork() zusammen mit exit()?: Linux Systemaufrufe
Status: (Frage) beantwortet Status 
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?







        
Bezug
fork() zusammen mit exit()?: Antwort
Status: (Antwort) fertig Status 
Datum: 20:00 Di 08.11.2011
Autor: MathePower

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

Bezug
                
Bezug
fork() zusammen mit exit()?: Frage (beantwortet)
Status: (Frage) beantwortet Status 
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?

Bezug
                        
Bezug
fork() zusammen mit exit()?: Antwort
Status: (Antwort) fertig Status 
Datum: 20:37 Di 08.11.2011
Autor: MathePower

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

Bezug
                                
Bezug
fork() zusammen mit exit()?: Frage (beantwortet)
Status: (Frage) beantwortet Status 
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?

Bezug
                                        
Bezug
fork() zusammen mit exit()?: Antwort
Status: (Antwort) fertig Status 
Datum: 21:15 Di 08.11.2011
Autor: MathePower

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

Bezug
                                                
Bezug
fork() zusammen mit exit()?: Frage (beantwortet)
Status: (Frage) beantwortet Status 
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...

Bezug
                                                        
Bezug
fork() zusammen mit exit()?: Antwort
Status: (Antwort) fertig Status 
Datum: 21:31 Di 08.11.2011
Autor: MathePower

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

Bezug
        
Bezug
fork() zusammen mit exit()?: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
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


Bezug
                
Bezug
fork() zusammen mit exit()?: Frage (beantwortet)
Status: (Frage) beantwortet Status 
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?

Bezug
                        
Bezug
fork() zusammen mit exit()?: Antwort
Status: (Antwort) fertig Status 
Datum: 21:33 Di 08.11.2011
Autor: MathePower

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

Bezug
                        
Bezug
fork() zusammen mit exit()?: Antwort
Status: (Antwort) fertig Status 
Datum: 10:52 Mi 09.11.2011
Autor: Event_Horizon

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.


Bezug
Ansicht: [ geschachtelt ] | ^ Forum "C/C++"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien


^ Seitenanfang ^
www.matheraum.de
[ Startseite | Forum | Wissen | Kurse | Mitglieder | Team | Impressum ]