2015-11-24 1 views
-4

J'essaie d'exécuter cette commande execl dans un programme C et cela ne fonctionne tout simplement pas. J'ai également essayé avec quelques exemples de validation que j'ai trouvés sur Internet et ils ne fonctionnent pas non plus. (Je reçois toujours la même erreur)Impossible d'utiliser execl dans C

execl("/bin/ls", "/bin/ls", argv[1], NULL); 
bash: syntax error near unexpected token `"/bin/ls",' 

execl("/bin/date", "date", 0, 0); 
bash: syntax error near unexpected token `"/bin/date",' 

Merci et salutations.

+0

Pouvez-vous exécuter la même commande directement dans le bash? – Olaf

+0

Je ne peux pas exécuter ces commandes dans un programme ou dans le bash ... Voilà pourquoi je ne comprends pas ce qui ne va pas – Miguel

Répondre

5

Le message d'erreur que vous obtenez est ce qui se passe si vous essayez d'entrer l'appel de fonction C directement à la coquille:

[dbush] execl("/bin/date", "date", 0, 0); 
-bash: syntax error near unexpected token `"/bin/date",' 
[dbush] 

Vous devez mettre le code dans un programme C, compiler, et l'exécuter:

#include <stdio.h> 
#include <unistd.h> 

int main() 
{ 
    // the last argument should be a NULL pointer to signal the end of the arg list 
    execl("/bin/date", "date", NULL); 
} 

sortie:

[dbush] gcc -g -o /tmp/x1 /tmp/x1.c 
[dbush] /tmp/x1 
Tue Nov 24 20:11:54 UTC 2015 
+2

Et utilisez [wordexp()] (http://man7.org/linux/man- pages/man3/wordexp.3.html) pour développer le nom du chemin d'abord. Il supporte la même syntaxe que les shells POSIX, ainsi '' '' et '$ HOME' (et toutes les autres références de variables d'environnement shell POSIX) fonctionneront. –

+0

En effet, 'wordexp()' devrait fonctionner, alors que la suggestion maintenant supprimée d'utiliser 'execlp()' pour accommoder le chemin contenant tilde n'aurait probablement pas fonctionné (les docs nécessitent 'execlp()' pour effectuer une recherche de chemin uniquement si le nom de la commande ne contient pas de caractères de barre oblique, et dans tous les cas, il est peu probable qu'il gère '~' comme le fait le shell). –

+0

Cela fonctionne. Merci! Je vais essayer de corriger la première commande que j'ai mise dans la question parce que cela a été mis dans un programme C – Miguel

0

Sur mon ordinateur, en cours d'exécution linux ubuntu 14.04, u chantez bash en tant que shell de commande, cette commande ne peut pas être exécutée à partir de la ligne de commande.

Cependant, dans le programme C, il fonctionne correctement:

#define _POSIX_C_SOURCE 200112L 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 


int main(void) 
{ 
    pid_t pid = fork(); 
    if(0> pid) 
    { // then, error 
     perror("fork failed"); 
     exit(EXIT_FAILURE); 
    } 

    if(!pid) 
    { // child 
     execl("/bin/ls", "/bin/ls", NULL, NULL); 
     perror("execl failed"); 
     exit(EXIT_FAILURE); 
    } 

    printf("parent running after successful fork\n"); 
    return 0; 
} 

donnant une sortie qui ressemble à ceci:

Note: J'ai couru le programme à partir d'un terminal

Dans le Après la sortie, j'ai coupé la plupart des fichiers de la commande 'ls'.

parent running after successful fork 
a.out    howToCalcPrimeNumbers(works) tellwait.c 
bashloop.sh  howToCalcPrimeNumbers(works).c tellwait.h 
cards.h   howToCalcPrimeNumbers(works).o tellwait.h.gch 
cards.h.gch  input.txt    tellwait.o 
cent_convert.c   libSensors.h   test