Results 1 to 13 of 13

Thread: Linguaggio C

  1. #1
    Ensign Hardcore's Avatar
    Join Date
    Sep 2006
    Location
    Modena
    Posts
    3.550

    Default Linguaggio C

    Ho una problema secondo me con la fork che nn capisco bene cosa faccia, allora il programma ottiene da input il valore di quanti processi deve creare, ogni processo stampa su output chi è e poi muore. Il mio probelma, che ho in tutti i programmi in cui ho un numero di processi figli superiore a 1 è questo:
    quando il padre va a fare else printf("\nCreato Figlio con PID %d",pid);
    mi scrive sia Creafto Figlio con pid del figlio precedente e poi anche Creato Figlio del pid del figlio attuale:
    faccio copia e incolla di uno stdout con 3 figli...

    Sono il figlio n: 1
    Creato Figlio con PID 6605
    Sono il figlio n: 2Creato Figlio con PID 6605
    Creato Figlio con PID 6606

    Sono il figlio n: 3Creato Figlio con PID 6606
    Creato Figlio con PID 6607

    Processo [6605] Terminato
    Processo [6606] Terminato
    Processo [6607] Terminato

    Qualcuno ha la piu pallida idea di perke faccia cosi? io nn riesco a darmi pace non trovo il motivo...anche col debug lo fa e nn capisco..

    -------------------CODICE---------------
    /* INTERFACCIA FORK */
    #include <stdio.h>
    #include <unistd.h>
    #include <sys/wait.h>
    #include <sys/types.h>
    void figlio(int i);
    void main(int argc,char **argv){

    int a= 0;
    int pid;
    int status;
    int nfigli;
    if (argc <2){printf ("Errore numero parametri passato errato\n");
    exit (1);
    }
    nfigli= atoi(argv[1]);
    for (a=0;a<nfigli;a++){

    pid =fork();
    if (pid == 0){//Figlio
    figlio(a);

    } //Padre
    else printf("\nCreato Figlio con PID %d",pid);
    }
    for(a=0;a<nfigli;a++){

    pid=wait(&status);
    printf("\nProcesso [%d] Terminato ",pid);
    }

    exit (0);

    }
    void figlio(int i){
    printf("\nSono il figlio n: %d",i+1);
    exit (0);

    }


  2. #2
    Petty Officer 1st Class elroniel's Avatar
    Join Date
    Jun 2004
    Location
    Milano
    Posts
    795

    Default

    prova a mettere la parentesi graffa subito dopo l'else
    Lancelot
    Elro hero 8Lx..
    Elrobard bard 9Lx..
    Iodosan shaman 10Lx..
    Umbertone savage 6Lx..
    Bheowulf ranger 5Lx..
    Wighlaf nightshade 3Lx..
    Lurikion enchanter 3Lx..
    Eleneamh druid 3Lx..
    Mordred
    Ghrendel valkyrie 4Lx..
    Czernin theurgist 3Lx..
    Elhro friar 3Lx..
    umberh cleric 4Lx..
    Lamorak
    elroz healer 4Lx..

    http://riccardia.miniville.fr/

  3. #3
    Ensign Hardcore's Avatar
    Join Date
    Sep 2006
    Location
    Modena
    Posts
    3.550

    Default

    nulla cambia niente..

    ho notato però che se invece di fare printf, io scrivo:

    snprintf(stringa,"Il processo %d è terminato",pid);
    write (1,stringa,strlen(stringa));

    non me lo ripete ma per ognuno me ne scrive uno come dovrebbe giustamente funzionare...il motivo qual'è ....


  4. #4
    Lieutenant Brcondor's Avatar
    Join Date
    Mar 2005
    Posts
    4.610

    Default

    Quote Originally Posted by elroniel View Post
    prova a mettere la parentesi graffa subito dopo l'else
    ammazza che niubbo, c'è solo 1 istruzione dopo l'else ed erwa giusto
    " ...e mai un pensiero non al denaro, non all'amore né al cielo... " Fabrizio de Andrè

  5. #5
    Petty Officer 1st Class elroniel's Avatar
    Join Date
    Jun 2004
    Location
    Milano
    Posts
    795

    Default

    Quote Originally Posted by Brcondor View Post
    ammazza che niubbo, c'è solo 1 istruzione dopo l'else ed erwa giusto
    mio voto<---27(esame da 10 crediti)
    tuo voto<---24(esamino da 7,5 crediti) no ma GG

    da questa attenta analisi
    mia conoscenza di c>tua
    (scusa se ho spammato nel tuo post)
    Lancelot
    Elro hero 8Lx..
    Elrobard bard 9Lx..
    Iodosan shaman 10Lx..
    Umbertone savage 6Lx..
    Bheowulf ranger 5Lx..
    Wighlaf nightshade 3Lx..
    Lurikion enchanter 3Lx..
    Eleneamh druid 3Lx..
    Mordred
    Ghrendel valkyrie 4Lx..
    Czernin theurgist 3Lx..
    Elhro friar 3Lx..
    umberh cleric 4Lx..
    Lamorak
    elroz healer 4Lx..

    http://riccardia.miniville.fr/

  6. #6
    Ensign Hardcore's Avatar
    Join Date
    Sep 2006
    Location
    Modena
    Posts
    3.550

    Default

    riuppo perchè ho un nuovo problema questa volta molto piu fine

    Devo leggere da file riga per riga e salvare ciascuna in una stringa, io non conosco purtroppo a priori la dimensione di una riga,leggo un carattere e lo scrivo, e cosi via...esiste un mondo per allocare in modo dinamico sta stringa? cioè parti con dimensione 1, se scrivo allora aumenta da sola di dimensione, cioè fin che ti sto scrivendo sopra tu ingrandisciti...??


  7. #7
    Lieutenant Commander Axet's Avatar
    Join Date
    Sep 2003
    Location
    Ginevra
    Posts
    33.807

    Default

    Non ricordo un tubo di C che lo usavo 30 anni fa, ma ci sarà sicuramente un comando per leggere direttamente la riga intera.
    Spulciati la documentazione vedrai che lo trovi

    I'm no hero. Never was. Never will be.
    -----
    Soul of the mind, key to life's ether
    Soul of the lost, withdrawn from its vessel
    May strength be granted so the world might be mended...
    So the world might be mended...

  8. #8
    Lieutenant Commander Kith's Avatar
    Join Date
    Apr 2004
    Location
    Milano
    Posts
    22.142

    Default

    Invece non son così sicuro che ci sia, almeno quando usavamo C alle superiori ci facevano fare un ciclo che leggeva il carattere di indice i fino al carattere "tappo" e li salvava man mano in una stringa....
    featuring new Uber Computer: i7-950(turbo on 3,2ghz) with 6 GB XMS Corsair RAM , Nvidia Geforce 460 GTX @ 700mhz , on Gigabyte X58A UD3R rev 2.0, HD Seagate 1TB, Ali Corsair Modular 650w, Thermaltake V9 BLACCKX.

  9. #9
    Lieutenant Commander Axet's Avatar
    Join Date
    Sep 2003
    Location
    Ginevra
    Posts
    33.807

    Default

    Dici? Boh mi par molto strano, leggere un intera riga da file di testo è roba comune.. cmq come detto C non lo uso da secoli quindi di più nin zò

    I'm no hero. Never was. Never will be.
    -----
    Soul of the mind, key to life's ether
    Soul of the lost, withdrawn from its vessel
    May strength be granted so the world might be mended...
    So the world might be mended...

  10. #10
    Lieutenant Commander Kith's Avatar
    Join Date
    Apr 2004
    Location
    Milano
    Posts
    22.142

    Default

    Boh non ne sono sicuro al 100% però mi ricordavo sta cosa del carattere di tappo (che in sostanza è un carattere che ti dice che la stringa è finita), quindi pur essendo abituato al java in cui una roba del genere è routine, ho pensato che forse in C non era implementato... però mai dire mai
    featuring new Uber Computer: i7-950(turbo on 3,2ghz) with 6 GB XMS Corsair RAM , Nvidia Geforce 460 GTX @ 700mhz , on Gigabyte X58A UD3R rev 2.0, HD Seagate 1TB, Ali Corsair Modular 650w, Thermaltake V9 BLACCKX.

  11. #11
    Ensign Hardcore's Avatar
    Join Date
    Sep 2006
    Location
    Modena
    Posts
    3.550

    Default

    @axet: precisazione quello che dici tu esiste, ma è all'interno di una serie di librerie e comandi che non posso usare, fa parte dei vari fopen ecc, il mio è un esame su Sistemi Operativi (precisamente unix), si utilizza quindi open close, e la tabella dei file aperti, e purtroppo tale comando non esiste,per questo chideve se esiste un metodo per creare un array che aumentana automaticamente di dimensione in caso di scrittura e di stato full, in java so per certo che ci sia, non vorrei che in C non ci sia mai stato


  12. #12
    Lieutenant Commander San Vegeta's Avatar
    Join Date
    Oct 2003
    Location
    Bologna
    Posts
    12.153

    Default

    Quote Originally Posted by Hardcore View Post
    Ho una problema secondo me con la fork che nn capisco bene cosa faccia, allora il programma ottiene da input il valore di quanti processi deve creare, ogni processo stampa su output chi è e poi muore. Il mio probelma, che ho in tutti i programmi in cui ho un numero di processi figli superiore a 1 è questo:
    quando il padre va a fare else printf("\nCreato Figlio con PID %d",pid);
    mi scrive sia Creafto Figlio con pid del figlio precedente e poi anche Creato Figlio del pid del figlio attuale:
    faccio copia e incolla di uno stdout con 3 figli...
    Sono il figlio n: 1
    Creato Figlio con PID 6605
    Sono il figlio n: 2Creato Figlio con PID 6605
    Creato Figlio con PID 6606

    Sono il figlio n: 3Creato Figlio con PID 6606
    Creato Figlio con PID 6607

    Processo [6605] Terminato
    Processo [6606] Terminato
    Processo [6607] Terminato
    Qualcuno ha la piu pallida idea di perke faccia cosi? io nn riesco a darmi pace non trovo il motivo...anche col debug lo fa e nn capisco..
    -------------------CODICE---------------
    /* INTERFACCIA FORK */
    #include <stdio.h>
    #include <unistd.h>
    #include <sys/wait.h>
    #include <sys/types.h>
    void figlio(int i);
    void main(int argc,char **argv){
    int a= 0;
    int pid;
    int status;
    int nfigli;
    if (argc <2){printf ("Errore numero parametri passato errato\n");
    exit (1);
    }
    nfigli= atoi(argv[1]);
    for (a=0;a<nfigli;a++){
    pid =fork();
    if (pid == 0){//Figlio
    figlio(a);
    } //Padre
    else printf("\nCreato Figlio con PID %d",pid);
    }
    for(a=0;a<nfigli;a++){
    pid=wait(&status);
    printf("\nProcesso [%d] Terminato ",pid);
    }
    exit (0);
    }
    void figlio(int i){
    printf("\nSono il figlio n: %d",i+1);
    exit (0);
    }
    l'unica cosa che mi vien da pensare senza fare un debug è che ereditando le variabili dal padre, eredita anche i valori attuali delle variabili coinvolte nel ciclo for e nella funzione di stampa
    I rubinetti a casa di Chuck Norris non perdono, vincono.

    In the beginning there was nothing...then Chuck Norris Roundhouse kicked that nothing in the face and said "Get a job". That is the story of the universe.

    Quote Originally Posted by Wolfo View Post
    Concordo e propongo ban temporanei per chi critica la topa , la topa non si critica , dal trombabile in su non si commenta in modo sgradevole.
    la tua ignoranza in materia e' raccapricciante
    -cit. Estrema, 2022

  13. #13
    Lieutenant Commander San Vegeta's Avatar
    Join Date
    Oct 2003
    Location
    Bologna
    Posts
    12.153

    Default

    Quote Originally Posted by Hardcore View Post
    riuppo perchè ho un nuovo problema questa volta molto piu fine
    Devo leggere da file riga per riga e salvare ciascuna in una stringa, io non conosco purtroppo a priori la dimensione di una riga,leggo un carattere e lo scrivo, e cosi via...esiste un mondo per allocare in modo dinamico sta stringa? cioè parti con dimensione 1, se scrivo allora aumenta da sola di dimensione, cioè fin che ti sto scrivendo sopra tu ingrandisciti...??
    no in C la prassi è allocare un array di char di dimensione prefissata N e leggere al max N caratteri per volta.

    fare quello che vuoi far tu è oneroso, ma è essenzialmente il meccanismo che usano le List, ArrayList e compagni in java: hanno un buffer interno che viene ricreato più grande se gli oggetti da inserirvi superano le dimensioni correnti
    I rubinetti a casa di Chuck Norris non perdono, vincono.

    In the beginning there was nothing...then Chuck Norris Roundhouse kicked that nothing in the face and said "Get a job". That is the story of the universe.

    Quote Originally Posted by Wolfo View Post
    Concordo e propongo ban temporanei per chi critica la topa , la topa non si critica , dal trombabile in su non si commenta in modo sgradevole.
    la tua ignoranza in materia e' raccapricciante
    -cit. Estrema, 2022

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
[Output: 94.73 Kb. compressed to 80.55 Kb. by saving 14.18 Kb. (14.97%)]