Albero binario di processi fork()-LINUX

di il
9 risposte

Albero binario di processi fork()-LINUX

Ciao a tutti ragazzi, lo scopo è quello di creare un albero binario di processi ad arbitraria profondità con l'uso della funzione fork() ecc...
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

#define N 3

void build_binary_tree_processes(int level){
    int figlio_1,figlio_2,x,livello=0;
jmp:
    figlio_1=fork();
    if(figlio_1){
        figlio_2=fork();
        if(figlio_2){
            waitpid(figlio_2,&x,0);
            waitpid(figlio_1,&x,0);
            exit(0);
        }
        livello++;
        printf("(figlio_2)<PPID>: %d <PID>: %d <livello>: %d\n",getppid(),getpid(),livello);
        if(livello==level)
            exit(0);
        else
            goto jmp;
    }
    livello++;
    printf("(figlio_1)<PPID>: %d <PID>: %d <livello>: %d\n",getppid(),getpid(),livello);
    if(livello==level)
        exit(0);
    else
        goto jmp;
}

int main(){
    build_binary_tree_processes(N);
    return 0;
}
Questa è la soluzione che ho trovato, è da un po che mi sto arrovellando ma non riesco a trovare una soluzione che non sia ne ricorsiva, ne con l'uso della goto.....
Avete suggerimenti ??
Grazie

9 Risposte

  • Re: Albero binario di processi fork()-LINUX

    Nanni16 ha scritto:


    Ciao a tutti ragazzi, lo scopo è quello di creare un albero binario di processi ad arbitraria profondità con l'uso della funzione fork() ecc...
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/wait.h>
    
    #define N 3
    
    void build_binary_tree_processes(int level){
        int figlio_1,figlio_2,x,livello=0;
    jmp:
        figlio_1=fork();
        if(figlio_1){
            figlio_2=fork();
            if(figlio_2){
                waitpid(figlio_2,&x,0);
                waitpid(figlio_1,&x,0);
                exit(0);
            }
            livello++;
            printf("(figlio_2)<PPID>: %d <PID>: %d <livello>: %d\n",getppid(),getpid(),livello);
            if(livello==level)
                exit(0);
            else
                goto jmp;
        }
        livello++;
        printf("(figlio_1)<PPID>: %d <PID>: %d <livello>: %d\n",getppid(),getpid(),livello);
        if(livello==level)
            exit(0);
        else
            goto jmp;
    }
    
    int main(){
        build_binary_tree_processes(N);
        return 0;
    }
    Questa è la soluzione che ho trovato, è da un po che mi sto arrovellando ma non riesco a trovare una soluzione che non sia ne ricorsiva, ne con l'uso della goto.....
    Avete suggerimenti ??
    Grazie
    Penso che per evitare il goto (Dont' try this at home ) l'unica soluzione è proprio la ricorsività, e magari prova a svilupparlo con un do-while.
  • Re: Albero binario di processi fork()-LINUX

    Cosa c'è di male in un goto? In questo caso non mi sembra che renda il codice incomprensibile.
    Eventualmente puoi provare a sostituire con un while(1) e un bel continue al posto del goto (se necessario) ma... sarà davvero più leggibile?
  • Re: Albero binario di processi fork()-LINUX

    candaluar ha scritto:


    Cosa c'è di male in un goto? In questo caso non mi sembra che renda il codice incomprensibile.
    Eventualmente puoi provare a sostituire con un while(1) e un bel continue al posto del goto (se necessario) ma... sarà davvero più leggibile?
    In questo piccolo pezzo di codice il goto non lo rende incomprensibile. In linea generale, quando hai centinaia se non migliaia di linee di codice, ritrovarti un bel goto non è bello. A me è capitato e vi giuro che c'è da andare di matto.

    Giusto per farci due risate, eccovi questa bella vignetta

  • Re: Albero binario di processi fork()-LINUX

    quando hai centinaia se non migliaia di linee di codice, ritrovarti un bel goto non è bello. A me è capitato e vi giuro che c'è da andare di matto.
    Il goto è confinato all'interno di una funzione: se hai una funzione di migliaia di linee di codice direi che hai ben altri problemi e di sicuro il goto non ne è la causa!
    Qui si trova un'interessante discussione sull'utilizzo del goto http://stackoverflow.com/questions/24451/is-it-ever-advantageous-to-use-goto-in-a-language-that-supports-loops-and-func.
    Detto questo chiudo perchè sono irrimediabilmente OT e per questo chiedo scusa.
  • Re: Albero binario di processi fork()-LINUX

    candaluar ha scritto:


    Il goto è confinato all'interno di una funzione: se hai una funzione di migliaia di linee di codice direi che hai ben altri problemi e di sicuro il goto non ne è la causa!
    Certo ma quando fai manutenzione su codice scritto da altri, e poco commentato tra l'altro, puoi ritrovarti le peggio schifezze. Mi sono ritrovato a fare manutenzione su codice scritto con funzioni immense (al diavolo la modularità) ed una bella grattugiata di goto . Non voglio dire che c'è sempre una correlazione stretta tra codice scritto male ed il goto ma non a caso è considerato una delle peggiori cause dello spaghetti code.

    Comunque sì @Nanni16, scusaci per l'Off-Topic
  • Re: Albero binario di processi fork()-LINUX

    Grazie ragazzi, quindi voi dite che il goto sotto determinate condizioni non è cosi odiato ? (questo un po lo immaginavo alla fine in assembler si usa come non ci fosse un domani ahaha) comunque la mia domanda è se ci fosse un modo piu elegante per farlo... Soluzioni a cui non ho pensato tutto qua.....
  • Re: Albero binario di processi fork()-LINUX

    Nanni16 ha scritto:


    Grazie ragazzi, quindi voi dite che il goto sotto determinate condizioni non è cosi odiato ? (questo un po lo immaginavo alla fine in assembler si usa come non ci fosse un domani ahaha) comunque la mia domanda è se ci fosse un modo piu elegante per farlo... Soluzioni a cui non ho pensato tutto qua.....
    Essendo programmazione non strutturata in assembler per forza di cose usi i salti incodizionati come il goto. La programmazione strutturata, grazie allo sviluppo dei linguaggi di alto livello, è nata proprio per questo, ovvero evitare salti incodizionati. Edsger Dijkstra, fu uno dei primi a criticare aspramente il goto.
  • Re: Albero binario di processi fork()-LINUX

    Comunque, se vuoi evitare il goto, metti tutto in un while(1) (l'inizio in corrispondenza dell'etichetta jmp) e al posto del goto ci metti un bel continue
  • Re: Albero binario di processi fork()-LINUX

    OK grazie!!!
Devi accedere o registrarti per scrivere nel forum
9 risposte