Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 02/07/2014, à 11:22

bird12358

Execution d'une commande en C

Bonjour,


Je souhaiterai executer une commande du terminal dans un de mes programmes en C. J'ai créé ce programme:

char * arg[] =  { "ls"  };
    while(1)
    {
        cout << "la" << endl;
        execvp("ls",argv);
        cout << "la1" << endl;
        usleep(40000);
    }

Mais quand j'execute le programme il me fait un retour de la commande et il me retourne une erreur.

Quelqu'un pourrait me dire pourquoi il y a cette erreur?

D'avance merci.

Hors ligne

#2 Le 02/07/2014, à 11:29

pires57

Re : Execution d'une commande en C

salut, c'est du C++ ton language, pas du C
quelle est l'erreur retourné?


Utilisateur d'Archlinux, Ubuntu et Kali Linux
Administrateur système et réseau spécialisé Linux.
LinkedIn

Hors ligne

#3 Le 02/07/2014, à 17:01

bird12358

Re : Execution d'une commande en C

En fait il me renvoie:
--> la
--> le retour de la commande ls
-->  mon programme a quitté avec le code 0

Hors ligne

#4 Le 02/07/2014, à 17:08

pires57

Re : Execution d'une commande en C

et il est ou le problème? il y a pas de message d'erreur la ...


Utilisateur d'Archlinux, Ubuntu et Kali Linux
Administrateur système et réseau spécialisé Linux.
LinkedIn

Hors ligne

#5 Le 02/07/2014, à 17:09

pingouinux

Re : Execution d'une commande en C

Bonjour,
C'est normal. execvp remplace l'exécutable de ton programme par celui de la commande que tu lances. La suite de ton programme est donc ignorée.

Hors ligne

#6 Le 02/07/2014, à 17:14

bird12358

Re : Execution d'une commande en C

Comment je peux faire pour faire des appels répétés de la commande?

Hors ligne

#7 Le 02/07/2014, à 17:15

claudius01

Re : Execution d'une commande en C

Bonjour,

Je confirme ce comportement tout à fait normal et conforme:
cf. An example using fork, execvp and wait avec en particulier le commentaire "/* If execvp returns, it must have failed. */".

cf. également le man de execvp pour tout savoir...


Cordialement, A+
--
Claudius

Hors ligne

#8 Le 02/07/2014, à 18:00

bird12358

Re : Execution d'une commande en C

Voila j'ai fait un programme avec un fork, le voici:

char * arg[] =  { "ls" ,"/dev/*",(char *)NULL };
    pid_t  child_pid;
    int child_status;

    child_pid = fork();
    if(child_pid == 0) {
        /* This is done by the child process. */
        cout << "************" << endl;
        execvp("ls", arg);

        /* If execvp returns, it must have failed. */
        exit(0);
    }
    else {
        /* This is run by the parent.  Wait for the child
            to terminate. */
        pid_t tpid;
        do {
            tpid = wait(&child_status);
        } while(tpid != child_pid);

        usleep(4000);
        execvp(argv[0], argv);


        return child_status;
    }

Mais il n'aime pas le * apparemment:

ls: impossible d'accéder à /dev/video*: Aucun fichier ou dossier de ce type
************
ls: impossible d'accéder à /dev/video*: Aucun fichier ou dossier de ce type
************
ls: impossible d'accéder à /dev/video*: Aucun fichier ou dossier de ce type
************

Pourquoi l'étoile ne marche pas dans la commande alors que dans un terminal ca fonctionne ?

Hors ligne

#9 Le 02/07/2014, à 18:43

claudius01

Re : Execution d'une commande en C

Parce que le * est résolu par le ksh ou le bash de la session terminal.

Hors ligne

#10 Le 02/07/2014, à 18:58

pingouinux

Re : Execution d'une commande en C

bird12358 #8 a écrit :
char * arg[] =  { "ls" ,"/dev/*",(char *)NULL };
ls: impossible d'accéder à /dev/video*: Aucun fichier ou dossier de ce type

C'est bizarre, car si /dev/* n'était pas expansé, on ne devrait pas avoir ce message d'erreur.

Ajouté : Je pense aussi que arg ne doit contenir que les arguments, à l'exclusion de ls
Édité : En regardant la doc, je pense avoir écrit une bêtise

Dernière modification par pingouinux (Le 02/07/2014, à 21:09)

Hors ligne

#11 Le 02/07/2014, à 20:34

claudius01

Re : Execution d'une commande en C

Effectivement, intéressant comme problème.
Problème de droits d'accès peut-être ?

Edit: De plus, le message "Aucun fichier ou dossier de ce type" ferait penser que le "/dev/video*" n'est pas présent au travers de la commande execvp, alors qu'il semble l'être depuis une session terminal ?!.. Vraiment intéressant ce problème qui mérite de le reproduire, ce que je m'en vais faire dans une VM.
A suivre...

Dernière modification par claudius01 (Le 02/07/2014, à 22:03)

Hors ligne

#12 Le 02/07/2014, à 22:47

bird12358

Re : Execution d'une commande en C

Je n'ai pas essayé d'executer le programme en tant que root mais je ne pense pas que ca change énormément le résultat.

Edit: J'ai trouvé une autre solution en fouillant sur internet.

//char * arg[] =  { "ls" ,"/dev/video*",(char *)NULL };
    char * arg[] =  { "find" ,"/dev/","-name","video*",(char *)NULL };

    pid_t  child_pid;
    int child_status;

    child_pid = fork();
    if(child_pid == 0) {
        /* This is done by the child process. */
        cout << "************" << endl;
        execvp("find", arg);

        /* If execvp returns, it must have failed. */
        exit(0);
    }
    else {
        /* This is run by the parent.  Wait for the child
                to terminate. */
        pid_t tpid;
        do {
            tpid = wait(&child_status);
        } while(tpid != child_pid);

        usleep(4000);
        execvp(argv[0], argv);


        return child_status;
    }

Je ne sais pas pourquoi mais il ne doit pas aimer les * ... sad

Dernière modification par bird12358 (Le 02/07/2014, à 23:14)

Hors ligne

#13 Le 03/07/2014, à 06:21

pingouinux

Re : Execution d'une commande en C

Je soupçonne le message d'erreur en #8 de provenir de cette ligne en #12, qui a dû être commentée depuis :

//char * arg[] =  { "ls" ,"/dev/video*",(char *)NULL };

L'explication de claudius01 #9 est alors vraisemblablement la bonne.

Hors ligne