Exec / strtok

di il
4 risposte

Exec / strtok

Ciao, avrei una domanda da porvi.
Sto cercando di capire come funzionano alcune funzioni della famiglia exec.
Mi è parso di capire che se ho una stringa che contiene un numero variabile di opzioni devo utilizzare execv().

Per essere più precisi, il mio problema è il seguente.
Dato un file che contiene una lista di comandi + opzioni (in numero variabile) per ogni riga, devo utilizzare una funzione della famiglia exec per eseguirli.

Un esempio di file di input potrebbe essere il seguente:
ps
ls -l -a
mkdir ewfff
...

Ora, (a parte tutte le questioni relative alla clonazione del processo) mi sembra di capire che dovrei dividere le stringe in "parole", allocare un vettore di puntatori (l'ultimo dei quali punti a NULL) e passare il vettore a execv, insieme a un certo altro numero di paramentri.
E' corretto? E' il modo più semplice/migliore di fare questa cosa? Mi fareste un esempio di implementazione? (Basta uno schema della matrice e la chimata dell'exec)

Nel caso fosse così, volevo utilizzare la funzione strtok per dividere le stringhe.
Qualcuno mi spiegherebbe come si usa in pratica e mi farebbe un esempio?

Il problema di eseguire un file di comandi dovrebbe essere piuttosto "standard", come si risolve in genere?

Vi ringrazio molto.

4 Risposte

  • Re: Exec / strtok

    Per la strtok trovi info un po' ovunque ...

    http://www.cplusplus.com/reference/cstring/strtok
  • Re: Exec / strtok

    Ciao, mi dite qual è il problema con questo codice, se riuscite?

    Il programma apre un file con una lista di comandi + opzioni in numero variabile e li esegue con exec. In teaoria
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/wait.h>
    #include <string.h>
    
    #define MAX 500
    #define MAXW 20
    
    int main ()
    {
    	char **s, *command, tmp[MAX];
    	FILE *fin; 
    	int i = 0;
    
    	fin = fopen("filein.txt", "r");
    	if(fin == NULL){
    		fprintf(stderr, "%s", "Unable to open input file\n");
    		exit(1);
    	}
    			
    	s = malloc(10*sizeof(char*));
    	if(s == NULL){
    		fprintf(stderr, "%s", "Unable to allocate memory, **s\n");
    		exit(1);
    	}
    	
    	while(fgets(tmp, MAX, fin) != NULL) {
    		command = strtok (tmp," \n");
    		i = 0;		
    		while (i == 0 || s[i-1]!= NULL){			
    			s[i] = strtok(NULL, " \n");
    			i++;
    		}
    
    		if(!fork()){
    			fprintf(stdout, "Executing %s\n\n\n", command);
    			execvp(command, s);
    			fprintf(stderr, "Something is wrong!");
    		}
    		else {
    			wait(NULL);
    		}
    	}
    	return 0;
    }
    
    
    Grazie!
  • Re: Exec / strtok

    Allochi un puntatore a puntatore (**s) ma non allochi lo spazio per ogni stringa puntata (s[0] e così via) ... mancano le malloc per le varie stringhe ...
  • Re: Exec / strtok

    Non mi è chiarissimo come funzioni la strtok, ma dovrebbe ritornare un puntatore, quindi assegnerei a un puntatore il puntatore.
    Tra l'altro, se chiedo solo di stampare, stampa tutte le stringhe.
    Cioè, quetso codice
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define MAX 500
    #define MAXW 20
    
    int main ()
    {
    	//char str[] ="- This, a sample string.";
    	char tmp[MAX], *command; //This is the string where I'm putting the line I read from the file.
    	//char * pch;
    	char **s, **s1; //This is the pointer to vectors I will allocate
    	FILE *fin; 
    	int i = 0;
    
    	//open input file	
    	fin = fopen("filein.txt", "r");
    	if(fin == NULL){
    		fprintf(stderr, "%s", "Unable to open input file\n");
    		exit(1);
    	}
    			
    	//allocation of s as a vector of pointers to pointers.
    	s = malloc(10*sizeof(char*));
    	if(s == NULL){
    		fprintf(stderr, "%s", "Unable to allocate memory, **s\n");
    		exit(1);
    	}
    	
    	while(fgets(tmp, MAX, fin) != NULL) {
    		command = strtok (tmp," \n");
    		fprintf(stdout, "%s\n", command);
    		i = 0;		
    		while (i == 0 || s[i-1]!= NULL){			
    			s[i] = strtok(NULL, " \n");
    			fprintf(stdout, "%d " "%s\n", i, s[i]);
    			i++;
    		}	
    	}
    	return 0;
    }
    Stampa:
    ./strtok
    ls
    0 -l
    1 -a
    2 (null)
    cat
    0 exe6_1.c
    1 (null)
    mkdir
    0 src
    1 (null)
    cp
    0 main.c
    1 src/
    2 (null)

    E quando lo eseguo col codice che ho postato prima, esegue bene ls -l -a e poi si blocca.
Devi accedere o registrarti per scrivere nel forum
4 risposte