Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    1,202

    [C] Un programma che si richiama da solo...

    E' pensabile sviluppare un programma che si invochi da solo all'interno di un ciclo, passandosi dei parametri tra cui un contatore che conta quante volte si è già richiamato?

    qualcosa come:

    codice:
    nomeprogramma.c
    
    [...]
    
    char nome[18]="./nomeprogramma.c\0";
    char cont[2];
    
    for(int i=0; i<5; i++){
      sprintf(cont,"%d",i);
      execlp(nome,nome,cont,NULL);
      }
    
    [...]
    Debian GNU/Linux sid
    Publishing a theory should not be the end of one's conversation with the universe, but the beginning. (Eric S. Raymond)
    Kernel 2.6.14-ck1

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    1,202
    Ehm, lasciate perdere il ".c", quello è ovviamente il nome dell'eseguibile
    Debian GNU/Linux sid
    Publishing a theory should not be the end of one's conversation with the universe, but the beginning. (Eric S. Raymond)
    Kernel 2.6.14-ck1

  3. #3
    Devi fare una fork() per ogni execp() se no il programma "va a puttane" e non finisce mai. Se no usa system() che e` piu` semplice.

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    1,202
    L'ho fatto così

    codice:
    int main(int argc,char* argv[])
    {
       char nome[]="./lvl3";
       char cont[2];
       pid_t pid;
       int i,num;
    
       for(i=0; i<3; i++)
       {
          pid=fork();
          if (pid==0)
          {
             sprintf(cont,"%d",i);
             execlp(nome,nome,cont,NULL);
    	 printf("\nErrore in execlp\n");
    	}
          else
          {
              num=atoi(argv[1]);
    	  printf("\nMi eseguito %d volte\n",num);
           }
      }
    }
    E mi è crashato linux perchè non esce dalla fork
    Come faccio ad evitarlo? che funzione è system(), non la conosco
    Debian GNU/Linux sid
    Publishing a theory should not be the end of one's conversation with the universe, but the beginning. (Eric S. Raymond)
    Kernel 2.6.14-ck1

  5. #5
    Scusami ma ho dimenticato un particolare importante.

    Il programma ovviamente chiama se stesso all`infinito anche con fork(). Dovresti considerarla un po` come una ricorsione, passo base e passo ricorsivo, se no non ne esci.

    Per system() .. 'man system'. Ci sono le comodita`, usiamole. :quipy:

    Ma perche` devi fa sta roba?

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    1,202
    Purtroppo non ho i manuali installati sulla mia mandrake (non le sezioni delle funzioni C almeno), quindi man system mi dà no manual entry :quipy:

    Devo farla per un esercizio d'esame, dal testo abbastanza criptico a dir la verità, ma io ho capito che si richiama da sè
    Almeno, c'è scritto che riceve in ingresso due parametri, uno conta le volte che si connette ad un server e l'altro non ricordo; poi appunto si connette al server, e le volte successive non fa più questo passo...

    Io lo farei contando e autospedendomi il contatore no? :adhone: Però giustamente non se ne esce
    Debian GNU/Linux sid
    Publishing a theory should not be the end of one's conversation with the universe, but the beginning. (Eric S. Raymond)
    Kernel 2.6.14-ck1

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    1,202
    Ho risolto giocando coi parametri

    codice:
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <sys/types.h>
    
    int main(int argc,char* argv[])
    {
       char nome[]="./lvl3";
       char cont[2];
       int param;
       param=atoi(argv[1]);
       param++;
       printf("\nAttuale valore del parametro: %d\n",param);
    
         if(param<3){
             sprintf(cont,"%d",param);
    	 execlp(nome,nome,cont,NULL);
    	 printf("\nErrore in execlp\n");
    	 }
    
           if(param==3){
              printf("\nMi sono eseguito le 3 volte desiderate; termino :)\n");
    	  }
    
         return 0;
    }
    codice:
    [sly@localhost Client]$ gcc -Wall -g livello3.c -o lvl3
    livello3.c: In function `main':
    livello3.c:18: warning: implicit declaration of function `execlp'
    [sly@localhost Client]$ ./lvl3 -1
    
    Attuale valore del parametro: 0
    
    Attuale valore del parametro: 1
    
    Attuale valore del parametro: 2
    
    Attuale valore del parametro: 3
    
    Mi sono eseguito le 3 volte desiderate; termino :)
    [sly@localhost Client]$
    Debian GNU/Linux sid
    Publishing a theory should not be the end of one's conversation with the universe, but the beginning. (Eric S. Raymond)
    Kernel 2.6.14-ck1

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 © 2025 vBulletin Solutions, Inc. All rights reserved.