2016-07-09 31 views
6

Voglio eseguire il comando ls -a utilizzando execv() su una macchina Linux come segue:Come posso eseguire "ls" con le opzioni di un programma C?

char *const ptr={"/bin/sh","-c","ls","-a" ,NULL}; 
execv("/bin/sh",ptr); 

Tuttavia, questo comando non elenca i file nascosti. Che cosa sto facendo di sbagliato?

+0

Cosa si ottiene se si esegue 'sh -c ls -a' (come' "sh" "-c" "ls" "-a" ') al prompt della shell? –

risposta

9

io non sono sicuro perché si sta passando questa via /bin/sh ... ma dato che sei, è necessario passare tutti gli argomenti dopo -c come un singolo valore, perché questi sono ora essere interpretati da /bin/sh.

L'esempio è quello di confrontare la sintassi shell di

/bin/sh -c ls -a 

a

/bin/sh -c 'ls -a' 

Il secondo funziona, ma il primo punto non.

Così il vostro ptr dovrebbero essere definite come

char * const ptr[]={"/bin/sh","-c","ls -a" ,NULL}; 
+1

Ne hai presi due, ma ne hai persi un terzo. 'ptr' non viene dichiarato come il tipo corretto. – JdeBP

+2

Nota che una shell non è necessaria per chiamare un comando esterno: puoi semplicemente usare '{"/bin/ls "," -a ", NULL}'. – deltab

+0

@JdeBP - buon punto; corretto :-) –

5

Se avete bisogno di ottenere il contenuto di una directory da un programma , allora questo non è il modo migliore - si effettivamente necessario analizzare l'output di ls, che è generally considered a bad idea.

Invece è possibile utilizzare le funzioni libcopendir() e readdir() per ottenere ciò.

Qui è un piccolo programma di esempio che iterare (e la lista) tutti i file nella directory corrente:

#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <dirent.h> 

int main (int argc, char **argv) { 
    DIR *dirp; 
    struct dirent *dp; 

    dirp = opendir("."); 
    if (!dirp) { 
     perror("opendir()"); 
     exit(1); 
    } 

    while ((dp = readdir(dirp))) { 
     puts(dp->d_name); 
    } 

    if (errno) { 
     perror("readdir()"); 
     exit(1); 
    } 

    return 0; 
} 

Nota l'elenco non verrà ordinato, a differenza di default ls -a uscita.

Problemi correlati