ESECUTORE DI COMANDI

di il
4 risposte

ESECUTORE DI COMANDI

Come posso levare questi warning?

linea 38:[Warning] incompatible implicit declaration of built-in function 'exit' [enabled by default]
linea 87 :[Warning] passing argument 1 of 'execute' from incompatible pointer type [enabled by default]
linea 82 :[Warning] incompatible implicit declaration of built-in function 'exit' [enabled by default]

#include  <stdio.h>
#include  <sys/types.h>
#include  <errno.h>
#include  <stddef.h>

#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1



void  analizza(char *line, char **argv)
{
     while (*line != '\0') {       /* se la stringa presa in considerazione non rappresenta la fine della riga */ 
          while (*line == ' ' || *line == '\n'){
               *line = '\0';     /* sostituisci gli spazi con il carattere 0 */
               line++;
          }

          *argv = line;          /* save the argument position */
          argv++;
          while (*line != '\0' && *line != ' ' && *line != '\n') 
               line++;             /* skip the argument until ... */
     }

     *argv = '\0';                 /* mark the end of argument list  */
}

void  execute(char *argv) {
     pid_t pid;
     int stato, indice = 1;
     int lunghNomeFile;
     FILE *stream;
     char nomeFile[15];


     if ((pid = fork()) < 0) {     
          printf("*** ERRORE: creazione processo figlio fallita!\n");
          exit(EXIT_FAILURE);
     }
     else {
             if (pid == 0) {          /* processo figlio */
                   if (execvp(*argv, argv) < 0) {     /* esegue il comando */
                        printf("*** ERRORE: esecuzione fallita!\n");  /* perror("*** ERRORE esecuzione fallita"); */
                        exit(EXIT_FAILURE);
                    }
                   else
                        exit(EXIT_SUCCESS);
              }
             else {
                       /* processo padre */
           
                   while (getppid(wait(EXIT_SUCCESS || EXIT_FAILURE) != pid) )     /* aspetta il completamento del processo figlio */
            
                    lunghNomeFile = sprintf(nomeFile, "out.%d", &indice);                   
	           do {
                        stream = freopen(nomeFile, "w+", stdout);  /* w+: apre il file in scrittura e lettura, creandolo se necessario oppure 
                                                            troncando a 0 il suo contenuto se esisteva già */
                        printf("*** ERRORE in apertura del file!");  /* perror("*** ERRORE in apertura del file") */
	  
                   } while (stream == NULL);
                
          
                   indice++;
                   fclose(stream);                          
              }
               
     }
}

void  main(void) {
     
     char  line[1024];             /* input */
     char  *argv[64];              /* gli argomenti presenti nella linea di comando */
     int continua=1;
     while (continua) {                   
          
          printf("Inserisci un solo comando da eseguire: ");     
          gets(line);              /*  leggi la linea di comando  */
          printf("\n");
          analizza(line, argv);       /*   analizza line               */
          if (strcmp(argv[0], "exit") == 0)  /* E' una "exit"?     */
               exit(0);            /*  esegui exit  */
          else {
                if(strcmp(argv[0], "\0"))
                           continua=0; // oppure exit(0);
                else
                    execute(argv);           /* altrimenti esegui il comando */
          }
     }

}

4 Risposte

  • Re: ESECUTORE DI COMANDI

    Ciao,
    il primo e il terzo (che sono uguali) li dovresti eliminare con
    #include<stdlib.h>
    Ti diceva semplicemente che la funzione exit non era dichiarata da nessuna parte.

    Per il secondo: al momento non ho tempo di controllare tutto il codice ma evidentemente c'è qualche problema negli argomenti che passi alla funzione.
  • Re: ESECUTORE DI COMANDI

    Grazie.
    Ora devo risolvere questi:

    ES2SeqProgetto.c: In function ‘execute’:
    ES2SeqProgetto.c:55:21: warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘int *’ [-Wformat]
    ES2SeqProgetto.c: In function ‘main’:
    ES2SeqProgetto.c:88:21: warning: passing argument 1 of ‘execute’ from incompatible pointer type [enabled by default]
    ES2SeqProgetto.c:29:7: note: expected ‘char *’ but argument is of type ‘char **’
  • Re: ESECUTORE DI COMANDI

    Ho eliminato tutti gli warnig, ora quando lo compilo non da errori.
    Ma quando lo eseguo mi dice questo:

    In function `_fini':
    (.fini+0x0): multiple definition of `_fini'
    /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crti.o:(.fini+0x0): first defined here
    es2: In function `__data_start':
    (.data+0x0): multiple definition of `__data_start'
    /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o:(.data+0x0): first defined here
    es2: In function `__data_start':
    (.data+0x8): multiple definition of `__dso_handle'
    /usr/lib/gcc/x86_64-linux-gnu/4.6/crtbegin.o:(.data+0x0): first defined here
    es2:(.rodata+0x0): multiple definition of `_IO_stdin_used'
    /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o:(.rodata.cst4+0x0): first defined here
    es2: In function `_start':
    (.text+0x0): multiple definition of `_start'
    /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o:(.text+0x0): first defined here
    es2: In function `_init':
    (.init+0x0): multiple definition of `_init'
    /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crti.o:(.init+0x0): first defined here
    /usr/lib/gcc/x86_64-linux-gnu/4.6/crtend.o:(.dtors+0x0): multiple definition of `__DTOR_END__'
    es2:(.dtors+0x8): first defined here
    /usr/bin/ld: error in es2(.eh_frame); no .eh_frame_hdr table will be created.
    collect2: ld returned 1 exit status


    cosa può essere ?
  • Re: ESECUTORE DI COMANDI

    Risolto!
    perchè dovrei creare un esecutore di comandi che legge dalla linea di comando ed esegue il comando mettendo l'output nel file out.1 .

    Qualcuno mi può aiutare a capire come mai non mi crea il file ' out.1 ' ?

    Grazie!!!
Devi accedere o registrarti per scrivere nel forum
4 risposte