Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [C++] Implementazione nel programma della fork()

    Sto facendo un programma che usa la funzione fork() del sistema per calcolare, in base ad una stringa ed il corrispettivo carattere, la quantita di volte che il carattere si presenta nella posizione pari e nella posizione dispari.

    Il programma funziona correttamente!
    L'unico problema è che quando stampa il risultato, invece di farlo una volta l'ho fa per 4 volte di seguito ed è 1 cosa che non capisco assolutamente del perchè...

    codice:
    #include <iostream.h>
    #include <stdio.h>
    
    using namespace std;
    
    int main()
    {
    	char str[10], c;
    	int figlio1,figlio2,i,cont1=0,cont2=0;
    
    	cout << "Inserisci la stringa: ";
    	fgets(str,10,stdin);
    	cout << "Inserisci il carattere: ";
    	cin >> c;
    
    	if ((figlio1=fork())==-1){
    		cout << "Fork Impossibile!"<< endl;
    		exit(-1);
    	}
    	if ((figlio2=fork())==-1){
    		cout << "Fork Impossibile!"<< endl;
    		exit(-1);
    	}
    	else{
    		for (i=0; i < 10; i++){
    			if ((i%2)==0)
    				if (str[i]==c)
    					cont1++;
    		}
    	cout << endl << "Figlio1 = " << cont1 << endl;
    	}
    	
    		for (i=0; i < 10; i++){
    			if ((i%2)!=0)
    				if (str[i]==c)
    					cont2++;
    		}
    	cout << "Figlio2 = " << cont2 << endl;
    	
    	return EXIT_SUCCESS;
    
    }
    sapreste aiutarmi?
    La curiosità è la fonte della conoscenza.

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381

    Re: [C++] Implementazione nel programma della fork()

    Per il tuo problema non saprei dirti visto che non uso Linux.
    Però:
    codice:
    #include <iostream.h>
    #include <stdio.h>
    sono header deprecati. Al loro posto usa.
    #include <iostream>
    #include <cstdio>
    using namespace std;

    poi la fgets è inutile. Puoi usare "cin" tranquillamente per fare la stessa cosa.

    char str[10];
    cin >> str;

  3. #3

    Re: Re: [C++] Implementazione nel programma della fork()

    Originariamente inviato da shodan
    sono header deprecati. Al loro posto usa.
    #include <iostream>
    #include <cstdio>
    using namespace std;

    poi la fgets è inutile. Puoi usare "cin" tranquillamente per fare la stessa cosa.

    char str[10];
    cin >> str;
    Per quanto riguarda la fgets sono daccordo e l'ho sostituita con cin.
    Per le librerie invece, uso come compilatore g++ che ha esattamente quelle due librerie con il .h quindi non c'è la scelta.
    La curiosità è la fonte della conoscenza.

  4. #4
    Per farvi capire cosa ho in output all'esecuzione del codice vi posto il log:
    Codice PHP:
    panico@panico-desktop:~/Scrivania$ ./esfork
    Inserisci la stringa
    casabianc
    Inserisci il carattere
    b
    Figlio1 
    1Figlio2 0
    Figlio1 
    1Figlio2 0
    Figlio1 
    1Figlio2 0
    Figlio1 
    1Figlio2 
    qualcuno puo capire il perchè di queste ripetizioni?

    NB: ho modificato il modo in cui gli ultimi "cout" visualizzano i risulatti solo per un aspetto grafico:

    codice:
    printf("Figlio1 = %d, Figlio2 = %d\n", cont1, cont2);
    La curiosità è la fonte della conoscenza.

  5. #5
    Originariamente inviato da P4nico
    qualcuno puo capire il perchè di queste ripetizioni?
    leggiti bene la documentazione della fork: restituisce -1 in caso d'errore, 0 al processo figlio ed il pid (maggiore di zero) del figlio al padre.

    Nel tuo programma non fai distinzione tra padri e figli, ed in realtà generi 4 processi. Perciò hai quelle quattro ripetizioni.

    Eccoti un semplice esempio in C (ma che puoi trasformare facilmente in C++):
    Codice PHP:
    /*
    * Compiled and tested with:
    * i686-apple-darwin8-gcc-4.0.1 (GCC) 4.0.1 (Apple Computer, Inc. build 5367)
    */

    #include <unistd.h>
    #include <stdio.h>

    int main (void){
        const 
    pid_t aForkResult fork ();
        if (-
    == aForkResult){
            
    printf ("fork failure;\n");
        }
        else{
            
    printf ("This is printed out 2 times: once for child , once for father (aForkResult: %d);\n"aForkResult);
            if (
    == aForkResult){
                
    printf ("I am the child;\n");
            }
            else{
                
    printf ("I am the father. My child has pid: %d;\n"aForkResult);
                
    sleep (1); /* just to be sure, my child finish its job */
            
    }
        }
        return 
    0;

    Dici poi che sei obbligato ad includere <iostream.h> perché g++ non ti permette di includere <iostream>. Penso che la tua versione sia un po' vecchia, perché con la mia se includo <iostream.h> mi spara fuori il seguente, autoesplicante
    codice:
    /usr/include/c++/4.0.0/backward/backward_warning.h:32:2: warning:
    #warning This file includes at least one deprecated or antiquated header.
    Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard.
    Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>.
    To disable this warning use -Wno-deprecated.

  6. #6
    Se dici che non ho fatto distinzione tra figli e padre, ti volevo chiedere come tu la faresti intrepretando una richiesta di questo genere.

    Considera che il main è il padre, genera due figli, il primo deve fare la ricerca di quante volte un carattere è presente in una stringa nelle posizioni pari, il secondo figlio in quelle dispari...

    Cosa c'è che non quadra con il mio codice?
    La curiosità è la fonte della conoscenza.

  7. #7
    Originariamente inviato da P4nico
    Se dici che non ho fatto distinzione tra figli e padre, ti volevo chiedere come tu la faresti intrepretando una richiesta di questo genere.

    Considera che il main è il padre, genera due figli, il primo deve fare la ricerca di quante volte un carattere è presente in una stringa nelle posizioni pari, il secondo figlio in quelle dispari...

    Cosa c'è che non quadra con il mio codice?
    Che te ne fai dei valori restituiti dalle due fork che memorizzi nelle variabili figlio1 e figlio2? Non le utilizzi, perciò ti dico che non distingui tra padre e figli ;-)
    Il mio esempio che ho postato non ti chiarisce la cosa?
    Incomincia con una sola fork, non con 2.

  8. #8
    Ok ma con una sola chiamata di fork come faccio assegnare i valori dei pid sia a figlio1 che figlio2?
    La curiosità è la fonte della conoscenza.

  9. #9
    seguendo la tua documentazione ho riscritto questo :

    codice:
    #include <iostream>
    #include <stdio.h>
    
    using namespace std;
    
    int main()
    {
    	char str[30], c;
    	int figlio1,figlio2,i,cont1=0,cont2=0;
    
    	cout << "Inserisci la stringa: ";
    	cin >> str;
    //	fgets(str,10,stdin);
    	cout << "Inserisci il carattere: ";
    	cin >> c;
    
    	if ((figlio1=fork())==-1){
    		cout << "Fork Impossibile!"<< endl;
    		exit(-1);
    	}
    	else if (figlio1 == 0){
    		for (i=0; i < 30; i++){
    			if ((i%2)==0)
    				if (str[i]==c)
    					cont1++;
    		}
    	}
    
    	if ((figlio2=fork())==-1){
    		cout << "Fork Impossibile!"<< endl;
    		exit(-1);
    	}
    	else if (figlio2 == 0){
    		for (i=0; i < 30; i++){
    			if ((i%2)!=0)
    				if (str[i]==c)
    					cont2++;
    		}
    	}
    	cout << "Figlio1 = " << cont1 << ", Figlio2 = " << cont2<< endl;
    	
    	return EXIT_SUCCESS;
    
    }
    sempre gli stessi problemi però
    La curiosità è la fonte della conoscenza.

  10. #10
    Originariamente inviato da P4nico
    seguendo la tua documentazione ho riscritto questo :
    Non ti ho inviato nessuna documentazione, bensì un esempio scritto da me.

    Ora modifico il tuo codice, mettendo dei commenti e degli output per illustrarti meglio cosa succede al tuo programma (aggiungendo verso la fine un semplice meccanismo, per far sì che i padri non finiscano il proprio lavoro prima dei figli)

    Codice PHP:
    //
    // Written by P4nico,
    // modified with comment, extra output, and simple waiting for fathers by MacApp.
    //
    // Compiled and tested with:
    // i686-apple-darwin8-gcc-4.0.1 (GCC) 4.0.1 (Apple Computer, Inc. build 5367)
    //
    #include <iostream>
    #include <stdio.h>

    using namespace std;

    int main()
    {
        
    char str[30], c;
        
    int figlio1,figlio2,i,cont1=0,cont2=0;

        
    cout << "Inserisci la stringa: ";
        
    cin >> str;
    //    fgets(str,10,stdin);
        
    cout << "Inserisci il carattere: ";
        
    cin >> c;

        if ((
    figlio1=fork())==-1){
            
    cout << "Fork Impossibile!"<< endl;
            exit(-
    1);
        }
        else if (
    figlio1 == 0){
            
    // MacApp: questa parte viene eseguita solo dal figlio.
            
    for (i=030i++){
                if ((
    i%2)==0)
                    if (
    str[i]==c)
                        
    cont1++;
            }
        }
        
        
    // MacApp: questa parte del programma viene eseguita sia dal padre che dal figlio!
        // Infatti viene stampato DUE volte:
        // una volta con figlio1 = 0 dal primo figlio, l'altra con il pid del figlio dal padre. 
        
        
    cout << "MacApp: prima fork: figlio1: " << figlio1 << ";" << endl;
        
        
    // MacApp: adesso con la fork, il figlio generera' un nipote,
        // ed il padre un altro figlio che chiamiamo fratello.
        
    if ((figlio2=fork())==-1){
            
    cout << "Fork Impossibile!"<< endl;
            exit(-
    1);
        }
        else if (
    figlio2 == 0){
            
    // MacApp: questa parte viene eseguita dal nipote e dal fratello!
            
    for (i=030i++){
                if ((
    i%2)!=0)
                    if (
    str[i]==c)
                        
    cont2++;
            }
        }

        
    // MacApp: questa parte del programma viene eseguita
        // dal padre, dal figlio, dal fratello del figlio, e dal nipote del padre (figlio del primo figlio)!
        // Infatti viene stampata QUATTRO volte (non necessariamente nell'ordine del commento):
        // 1. Una volta con figlio1 = 0, figlio2 = 0 dal nipote.
        // 2. Un'atra volta con figlio1 = 0, figlio2 > 0 dal primo figlio;
        // 3. Un'altra volta con figlio1 > 0, figlio2 = 0 dal secondo figlio del padre, ovvero dal fratello del primo figlio.
        // 4. Un'altra volta con figlio1 > 0, figlio2 > 0 dal padre.
        
        
    cout << "MacApp: seconda fork: figlio1: " << figlio1 << "; figlio2: " << figlio2 << ";" << endl;

        
    cout << "Figlio1 = " << cont1 << ", Figlio2 = " << cont2<< endl;
        
        
    // MacApp: ora faccio attendere la fine dei lavori dei vari figli:
        // osserva che lo sleep in effetti non garantisce la sincronia al 100%.
        // Per fare un lavoro fatto bene, si dovrebbe mettere in piedi un meccanismo di comunicazione,
        // tra i vari processi generati, affinché il padre non finisca il proprio lavoro prima dei figli.
        
    if ((== figlio1) && (figlio2 0)){
            
    // MacApp: faccio attendere al primo figlio che il proprio figlio (nipote del padre) finisca il proprio lavoro;
            
    cout << "MacApp: il primo figlio attende che il nipote finisca il proprio lavoro: figlio1: " << figlio1 << "; figlio2: " << figlio2 << ";" << endl;
            
    sleep (1);
        }

        if ((
    figlio1 0) && (figlio2 0)){
            
    // MacApp: faccio attendere al padre che i suoi due figli finiscano il proprio lavoro;
            
    cout << "MacApp: il padre attende che i suoi due figli finiscano il proprio lavoro: figlio1: " << figlio1 << "; figlio2: " << figlio2 << ";" << endl;
            
    sleep (2);
        }
        
        
        return 
    EXIT_SUCCESS;


    Studia bene il primo esempio (scritto da me) che ti ho mandato!
    ;-)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.