Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Chiamata system() indipendente

    Buonasera, avrei un problemino con un programma in C compilato su linux (Ubuntu), in breve è un programma che simula una semplice intelligenza artificiale, ossia riceve in input delle richieste sotto forma di testo (terminate con un punto '.') completamente libere, legge il contenuto, ricerca parole chiave che conosce nel testo immesso e esegue le azioni chiamate,ad esemepio:

    output: Cosa posso fare per te?
    input: Senti potersti aprirmi opera?.
    output:.Ok buona ricerca...
    e dopo apre il browser.

    E' abbastanza carino, il problema principale è che agisce semplicemente attraverso le chiamate della funzione "system()" perciò il processo generato ha lo stesso pid di quello chiamante e questo è un po' scomodo, dato che le richieste sono a ciclo infinito, cioè posso dare un comando dietro l'altro (finché non chiedo di uscire), ma non posso fare una nuova richiesta fino a quando il processo chiamato non temrina, per continuare la sua esecuzione devo così chiudere il programma aperto con la chiama system() e questo riduce di molto l'utilità del programma.

    PEZZO DI CODICE CHE ESEGUE OPERA

    Codice PHP:
    ................
    /*ESEGUE OPERA*/
    else if(((*AZZ == 0) && (*APP == 4)) || ((*AZZ == 1) && (*APP == 4)))    
    {    
       
    sleep(1);   
       
    printf("Buona ricerca...\n");   
       
    system("opera");    
    }
     else if((*
    AZZ == 4) && (*APP == 4))  
    {    
       
    sleep(1);    
       
    printf("Abbandono il processo\n");    
       
    system("killall opera");    

    Tanto per chiarire gli "else if"... le parole riconosciute restituiscono un codice, se il programma riconosce una parola come "apri", "aprire","apriresti" ecc.. allora restituirà il valore "1", magari se riconosce "chiud", "chiuderesti" ecc... restituisce un valore "2", questo valore andrà a memorizzarsi nella variabile AZ (azione) puntata dalla variabile *AZZ nel codice sopra, mentre se riconosce una parola che corrisponde ad un applicazione come in questo caso "opera" allora memorizzerà il valore restituito nella variabile AP, puntata sopra da *APP.
    alla fine con 2 valori AZIONE - APPLICAZIONE riesce ad eseguire varie operazioni.
    In ogni modo non so come scindere il processo chiamato dalla funzione system() da quello chiamante, ossia il programma di IA (che per il momento ho chiamato Turing :-) ).
    Vorrei farlo nel modo più semplice possibile dato che i comandi sono veramente tanti, scritti uno in seguito all'altro come mostra il codice sopra.
    Grazie.

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Se ho capito bene, tu vorresti che il processo che esegue il programma principale "Turing" come lo hai chiamato tu (poi mi spieghi perché XD) creasse un altro processo per eseguire il comando che gli passi, mentre quello principale dovrebbe continuare a chiedere di immettere comandi... una specie di "mini shell" insomma, dico bene?

    Per farlo comunque devi conoscere almeno la funzione fork() dichiarata in unistd.h che ti consente di creare un nuovo processo, e poi l'ideale sarebbe eseguire il programma che passi da riga di comando con una delle funzioni della famiglia exec (execlp, execvp ecc...), sempre dichiarate in unistd.h, che sostituiscono l'immagine del processo padre con quella del programma da eseguire, a differenza di system che non fa altro che passare un comando alla shell di comando del sistema (in pratica avresti fatto una shell rudimentale che sfrutta le funzioni della shell già esistente...)
    every day above ground is a good one

  3. #3
    Grazie! ho dato un occhiata alle funzioni, la fork() fa al caso mio, sembra funzionare anche con la system(), ammetto di non volerla sostituire per pigrizia... Sembra andare ora, anche se mi da un anomalia strana e devo capire il perché... mi dice ogni cosa 2 volte!

    out: ciao!
    out: ciao!
    in: vorrei scrivere qualcosina.
    out: ok va bene!
    out: ok va bene!
    e apre gedit....

    vabbè risolvero' era solo per sottolineare l'ironicità ;-)
    grazie dell'aiuto...
    Ah gia... Turing è il primo nome che m è venuto in mente, non so ma m è sembrato carino dargli il nome di uno dei padri dell'informatica, almeno la shell con cui parlo ha anche un nome umano :-P

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Ora non conosco il codice che hai scritto (caso mai postalo e gli do un'occhiata) ma molto probabilmente il problema è dovuto al fatto che non conosci bene la gestione dei processi in Linux. Se provi un codice del genere (codato all'istante, quindi perdonami eventuali errori):

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <unistd.h>
    
    int main(void)
    {
       pid_t pid;
    
       pid = fork();
    
       if ( pid == 0 ) /* processo figlio */
          printf("Sono il figlio\n");
    
       printf("Sono il padre\n");
    
       return 0;
    }
    dovresti avere come output

    Sono il figlio
    Sono il padre
    Sono il padre

    o comunque una permutazione di queste tre stringhe (dipende dallo scheduling dei processi), ma comunque il fatto interessante è che la stringa "Sono il padre" viene stampata due volte, questo perché l'istruzione "printf("Sono il padre\n");" viene eseguita sia dal processo figlio che dal processo padre, mentre l'istruzione "printf("Sono il figlio\n");", poiché si trova sotto la condizione pid == 0, viene eseguta solo dal processo figlio, questo perché la fork() ritorna due volte, all'interno del figlio (0) e all'interno del padre (pid del figlio), sempre se non ci sono errori (-1).

    Se invece apporti questa modifica:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <unistd.h>
    
    int main(void)
    {
       pid_t pid;
    
       pid = fork();
    
       if ( pid == 0 ) /* processo figlio */
          printf("Sono il figlio\n");
       else /* processo padre */
          printf("Sono il padre\n");
    
       return 0;
    }
    "Sono il padre" viene stampata solo una volta, questo perché se pid == 0 siamo nel processo figlio e viene eseguita l'istruzione successiva, "altrimenti" (else) siamo nel processo padre e viene eseguita l'istruzione relativa. Nota però che "return 0;" verrebbe eseguita da entrambi i processi, perché non sta né nel corpo di if né in quello di else.

    Ancora

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <unistd.h>
    
    int main(void)
    {
       pid_t pid;
    
       pid = fork();
    
       if ( pid == 0 ) {/* processo figlio */
          printf("Sono il figlio\n");
          exit(0);
       }
    
       printf("Sono il padre\n");
    
       return 0;
    }
    in questo caso ottieni lo stesso output di prima perché il processo figlio, una volta eseguita la printf(), termina con l'istruzione exit(0), qundi non c'è bisogno dell'if-then-else.

    Insomma la questione è un po' troppo lunga da spiegare (ci sarebbe ad esempio da esaminare il caso della exec con la quale non ci sarebbe bisogno di nulla di tutto questo...) ma è un argomento intrattabile su un forum, dovresti studiare almeno i fondamenti della gestione dei processi in ambiente Unix. La programmazione multiprocesso all'inizio può spiazzare un po', ma con un po' di studio ci si rende conto che non è affatto difficile (almeno in Unix).

    Ah gia... Turing è il primo nome che m è venuto in mente, non so ma m è sembrato carino dargli il nome di uno dei padri dell'informatica, almeno la shell con cui parlo ha anche un nome umano :-P
    Ah ok pensavo fosse un riferimento alla macchina di Turing e non capivo il nesso XD
    every day above ground is a good one

  5. #5
    Sei stato molto chiaro, nonostante l'argomento sia lungo e da vedere bene, la mia intenzione era avere qualche indizio per trovare la miglio soluzione per ottenere quello che volevo, so che le cose non si posso imparare in poco tempo, bisogn spulciare, leggere... provare... leggere... provare... ecc... quando ho tempo do un occhiata alla gestione dei processi padre-figlio su unix.

    Cmq il motivo per cui non ho postato il codice è che è quasi 1000 righe e poi non è compatto ed elegante come vorrei, e da finire ed in parte è da rifare.

    La funzione che esegue i processi è questa:

    ------------------------------------------------------------------------------
    /*CONTROLLA LE VARIBILI ED ESEGUE I COMANDI*/
    void command (int *AZZ, int *APP, int *MOO)
    {
    //pid_t pid;
    int s;
    char *rix;
    rix= (char*)malloc(sizeof(char)* 50);
    //pid=fork();



    if(*AZZ == 6)
    {
    printf("Ok, va bene!\n");
    sleep(2);
    main();
    }
    else if((*AZZ == 1) && (*APP == 0))
    {
    sleep(1);
    printf("Cosa devo aprirti?\n");
    }
    else if ((*AZZ == 0) && (*APP == 0))
    {
    sleep(1);
    s= rand()%15;
    switch(s)
    {
    case 1: printf("Non ho capito niente! cosa vuoi che faccia?\n"); return;
    case 2: printf("Eeeh???\n"); return;
    case 3: printf("Ma cosa dici?\n"); return;
    case 4: printf("Cosa hai detto?\n"); return;
    case 5: printf("Cosa?\n"); return;
    case 6: printf("Mi rassegno ad ascoltarti, non capisco\n"); return;
    case 7: printf("Uffa... non ho capito!\n"); return;
    case 8: printf("Cosa vuoi?\n"); return;
    case 9: printf("Scusa... chiarisci cosa vuoi.\n"); return;
    case 10: printf("Puoi ripetere per favore... possibilmente in modo piu chiaro... grazie\n"); return;
    case 11: printf("Se..se.. certo...\n"); return;
    case 12: printf("Si'..si'.. come no!\n"); return;
    case 13: printf("Scusa... sono un po' duro di comprendonio\n");return;
    case 14: printf("Ma certo lo faccio subito... se solo capissi cosa vuoi!!!");return;
    case 15: printf("Ti vuoi spiegare meglio?!");return;
    default : printf("Salve a te\n"); return;
    }
    }
    /*GEDIT*/
    else if(((*AZZ == 0) && (*APP == 1)) || ((*AZZ == 1) && (*APP == 1)))
    {
    sleep(1);
    printf("Subito!\n");
    system("gedit");
    }
    else if((*AZZ == 4) && (*APP == 1))
    {
    sleep(1);
    printf("Subito!\n");
    system("killall gedit");
    }
    /*OPERA*/
    else if(((*AZZ == 0) && (*APP == 4)) || ((*AZZ == 1) && (*APP == 4)))
    {
    sleep(1);
    printf("Buona ricerca...\n");
    system("opera");
    }
    else if((*AZZ == 4) && (*APP == 4))
    {
    sleep(1);
    printf("Abbandono il processo\n");
    system("killall opera");
    }
    /*WORD*/
    else if(((*AZZ == 0) && (*APP == 2)) || ((*AZZ == 1) && (*APP == 2)))
    {
    sleep(1);
    printf("Buon lavoro\n");
    system("ooffice -writer");
    }
    else if((*AZZ == 4) && (*APP == 2))
    {
    sleep(1);
    printf("Chiudo word\n");
    system("killall ooffice -writer");
    }
    /*CALCOLATRICE*/
    else if(((*AZZ == 0) && (*APP == 3)) || ((*AZZ == 1) && (*APP == 3)))
    {
    sleep(1);
    printf("I calcoli li lascio a te... odio la matematica!\n");
    system("gcalctool");
    }
    else if((*AZZ == 4) && (*APP == 3))
    {
    sleep(1);
    printf("Basta con i calcoli\n");
    system("killall gcalctool");
    }
    /*PULIRE*/
    else if(*AZZ == 7)
    {
    printf("Va bene, pulisco tutto!\n");
    sleep(2);
    system("clear");
    }
    /*MPS*/
    else if(((*AZZ == 0) && (*APP == 8)) || ((*AZZ == 1) && (*APP == 8)))
    {
    sleep(1);
    printf("Spero che la situazione si buona...\n");
    system("opera http://www.mps.it/default.htm");
    }
    /*GOOGLE*/
    else if(((*AZZ == 0) && (*APP == 11)) || ((*AZZ == 1) && (*APP == 11)))
    {
    sleep(1);
    printf("Buona ricerca con il motore\n");
    system("opera www.google.it");
    }
    /*YAHOO*/
    else if(((*AZZ == 0) && (*APP == 12)) || ((*AZZ == 1) && (*APP == 12)))
    {
    sleep(1);
    printf("Va su Yahooooo\n");
    system("opera www.yahoo.it");
    }
    /*MOZZILLA*/
    else if(((*AZZ == 0) && (*APP == 13)) || ((*AZZ == 1) && (*APP == 13)))
    {
    sleep(1);
    printf("Ecco a te Mozzilla!\n");
    system("firefox");
    }
    else if((*AZZ == 4) && (*APP == 13))
    {
    sleep(1);
    printf("Lo chiudo, lo chiudo...\n");
    system("killall firefox");
    }
    /*EMESENE*/
    else if(((*AZZ == 0) && (*APP == 9)) || ((*AZZ == 1) && (*APP == 9)))
    {
    sleep(1);
    printf("Buona chiacchierata!\n");
    system("emesene");
    }
    else if((*AZZ == 4) && (*APP == 9))
    {
    sleep(1);
    printf("Ok lo faccio.\n");
    system("killall emesene");
    }
    /*TETRIS*/
    else if(((*AZZ == 0) && (*APP == 5)) || ((*AZZ == 1) && (*APP == 5)))
    {
    sleep(1);
    printf("Spero che tu faccia una gran partita!... probabilmente non sara' cosi'... ah ah ah\n");
    system("gnometris");
    }
    else if((*AZZ == 4) && (*APP == 5))
    {
    sleep(1);
    printf("Basta lo svago con tetris!\n");
    system("killall gnometris");
    }
    /*TERMINALE*/
    else if(((*AZZ == 0) && (*APP == 6)) || ((*AZZ == 1) && (*APP == 6)))
    {
    sleep(1);
    printf("Allora fai su serio! ;-)\n");
    system("gnome-terminal");
    }
    /*DATA E ORA*/
    else if(((*AZZ == 0) && (*APP == 10)) || ((*AZZ == 1) && (*APP == 10)))
    {
    sleep(1);
    printf("Garda. Calendario e orario...\n");
    system("cal");
    printf("Oggi:\n");
    system("date");
    }
    /*MAIL*/
    else if(((*AZZ == 0) && (*APP == 7)) || ((*AZZ == 1) && (*APP == 7)))
    {
    sleep(1);
    printf("Vai guarda la tua posta!;-)\n");
    system("opera it.mc247.mail.yahoo.com/mc/welcome?.gx=1&.rand=4nslgtk016j00");
    }
    /*SVUOTA CESTINO*/
    else if(((*AZZ == 0) && (*APP == 14)) || ((*AZZ == 1) && (*APP == 14)))
    {
    sleep(1);
    printf("Nessun problema\n");
    system("sudo rm -rf ~/.local/share/Trash/*");
    printf("Ok... ora la pattumiera è vuota!\n");
    }
    /*SCORTESE*/
    else if(*AZZ == 8)
    {
    sleep(1);
    s= rand()%5;
    sc++;
    switch(s)
    {
    case 1: printf("Non eseguo i comandi di chi è scortese e burbero\n"); return;
    case 2: printf("Non mi piace chi mi tratta così\n"); return;
    case 3: printf("Ti avverto, se continui a parlare in questo modo mi spengo!\n"); return;
    case 4: printf("Anche se sono un terminale certe parole le capisco lostesso!\n"); return;
    case 5: printf("Ah... che modi di parlare\n"); return;
    default : printf("Parla come mangi!\n"); return;
    }
    }
    /*SALUTO*/
    else if(*AZZ == 9)
    {
    sleep(1);
    s= rand()%5;
    switch(s)
    {
    case 1: printf("Ma Ciao!\n"); return;
    case 2: printf("Bah! chi si vede\n"); return;
    case 3: printf("Salve!\n"); return;
    case 4: printf("Hola!\n"); return;
    case 5: printf("Ehi... ciao!\n"); return;
    default : printf("Salve a te\n"); return;
    }
    }
    /*NIENTE*/
    else if(*AZZ == 2)
    {
    sleep(1);
    s= rand()%5;
    switch(s)
    {
    case 1: printf("Mi sento inutile\n"); return;
    case 2: printf("Ah ok!\n"); return;
    case 3: printf("Ma mi annoio!\n"); return;
    case 4: printf("Uff. Allora per cosa sto acceso?\n"); return;
    case 5: printf("Uff\n"); return;
    default : printf("Lo sai quando hai bisogno, padrone chiama, Turing risponde!\n"); return;
    }
    }
    /*GRAZIE*/
    else if(*AZZ == 3)
    {
    sleep(1);
    s= rand()%5;
    switch(s)
    {
    case 1: printf("Di neinte!\n"); return;
    case 2: printf("Prego\n"); return;
    case 3: printf("E' un piacere\n"); return;
    case 4: printf("Ma prego!\n"); return;
    case 5: printf("Non c'è di che\n"); return;
    default : printf("Felice di servire\n"); return;
    }
    }
    /*COSA CHIUDO?*/
    else if(*AZZ == 4)
    {
    sleep(1);
    printf("Cosa devo chiudere?\n");
    }
    /*RIAVVIA*/
    else if(*APP == 15)
    {
    sleep(1);
    printf("Sicuro che vuoi riavviare il computer?\n");
    scanf("%s", rix);
    if(rix == "si" || rix == "sì" || rix == "certo" || rix == "s" || rix == "yes" || rix == "y" || rix == "yex")
    system("sudo reboot");
    }
    /*SPENGI*/
    else if(*APP == 16)
    {
    sleep(1);
    printf("Sicuro che vuoi spengere il computer?\n");
    scanf("%s", rix);
    if(rix == "si" || rix == "sì" || rix == "certo" || rix == "s" || rix == "yes" || rix == "y" || rix == "yex")
    system("sudo halt");
    }
    /*VOCABOLARIO*/
    else if(*APP == 17)
    {
    sleep(1);
    printf("Questi sono i comandi che mi puoi dare:\n");
    system("cat vocabolario.txt");
    }
    /*AMULE*/
    else if(((*AZZ == 0) && (*APP == 18)) || ((*AZZ == 1) && (*APP == 18)))
    {
    sleep(1);
    printf("Complimenti, non si scarica illegalmente!!!\n");
    system("amule");
    }
    else if((*AZZ == 4) && (*APP == 18))
    {
    sleep(1);
    printf("Spero tu abbia torvato cio' che serviva, e soprattutto che tu l'abbia scaricato!...\n");
    system("killall amule");
    }
    /*DEFAULT*/
    else
    {
    sleep(1);
    printf("Che hai detto?\n");
    }
    return;
    }
    ------------------------------------------------------------------------------

    ( Cmq non dimentico le giornate che passo a studiare gli algoritmi in pseudo applicati al modello RAM del Turing! Il guaio di fare informatica all'università (primo anno) )

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.