2 Fragen: fork & pointer+malloc



  • Ich glaube mein Gehirn hat sich ausgeschalten; habe folgendes Problem:
    Ich habe einen Hauptprozess der z.B. 4 Kinder erzeugen soll. Mein Versuch in einer Schleife schaut so aus:

    for ( int i = 0; i < 4; i++ ) {
    pid_t pid = fork();
    if ( pid == 0 ) 
    ;
    else
    ;
    }
    

    Dabei erhalte ich aber 15 Kindprozesse?

    Die 2te Frage dreht sich um malloc.
    Wenn ich nun einen Zeiger habe, z.B. char* c; und nun fuer diesen Zeiger Speicher fuer ein character reservieren will, schreib ich dann c = malloc( sizeof( char ) ); oder c = malloc( sizeof( char* ) );? Ich hoffe doch es ist das erstere, sonst macht das fuer mich jedenfalls nicht viel Sinn.



  • moe szyslak schrieb:

    Die 2te Frage dreht sich um malloc.
    Wenn ich nun einen Zeiger habe, z.B. char* c; und nun fuer diesen Zeiger Speicher fuer ein character reservieren will, schreib ich dann c = malloc( sizeof( char ) ); oder c = malloc( sizeof( char* ) );? Ich hoffe doch es ist das erstere, sonst macht das fuer mich jedenfalls nicht viel Sinn.

    ersteres ist richtig. aber eigentlich braucht man doch kein 'malloc' für nur ein byte...



  • moe szyslak schrieb:

    Dabei erhalte ich aber 15 Kindprozesse?

    Fork heisst bekanntlich Gabel. Das heisst ab diesem Befehl laufen zwei identische Prozesse nebeneinander ab. Und nein, der Compiler weiss nicht automagisch dass Du den Kindprozess eigentlich bei der schliessenden geschweiften Klammer des IF beendet haben möchtest 😃 - das Resultat ist dass nach dem ersten fork zwei FOR-Schleifen laufen, nach dem zweiten vier usw...

    Die 2te Frage dreht sich um malloc.
    Wenn ich nun einen Zeiger habe, z.B. char* c; und nun fuer diesen Zeiger Speicher fuer ein character reservieren will, schreib ich dann c = malloc( sizeof( char ) ); oder c = malloc( sizeof( char* ) );? Ich hoffe doch es ist das erstere, sonst macht das fuer mich jedenfalls nicht viel Sinn.

    Aber latürnich... Das Muster bei Nicht-Arrays ist immer

    Typ* var = malloc(sizeof(Typ));
    

    Macht hier allerdings keinen Sinn weil der Standard Dir garantiert dass sizeof(char) == 1, also könntest Du auch malloc(1) schreiben.



  • Gottogott, natuerlich gehts mit ner for-Schleife nicht.
    Hab jetzt das Problem mit fork mittels rekursion geloest.

    zu fork, es macht natuerlich keinen sinn fuer ein einzelnes char speicher zu reservieren, es war ja auch nur als Beispiel gemeint.
    Ich war mir da nur nicht mehr ganz sicher ob ich das auch richtig mache!

    mfg
    moe



  • Hm, eigentlich würde es auch reichen vor verlassen des if (pid==0) Blocks das Programm mit exit(0) zu beenden - es wird ja nur der Kindprozess beendet.



  • LordJaxom schrieb:

    Hm, eigentlich würde es auch reichen vor verlassen des if (pid==0) Blocks das Programm mit exit(0) zu beenden - es wird ja nur der Kindprozess beendet.

    Stimmt eigentlich - darauf bin ich gar nicht gekommen, aber mit Rekrusion funktionierts ja auch.


Anmelden zum Antworten