2010-10-14 3 views
1

Si je voulais exécuter une commande shell sous Linux avec le programme ca, j'utiliseComment puis-je écrire des commandes à VxWorks shell avec le programme ca

system("ls"); 

Est-il possible que je peux y arriver dans Wind River vxworks?

J'ai trouvé l'exemple ci-dessous mais je me demande si je dois inclure des fichiers d'en-tête vxworks pour que cela fonctionne? Je suppose que je le fais, mais comment puis-je savoir lequel?

Exemple:

// This function runs a shell command and captures the output to the 
// specified file 
// 

extern int consoleFd; 
typedef unsigned int    (*UINTFUNCPTR)(); 

extern "C" int shellToFile(char * shellCmd, char * outputFile) 
{ 
int rtn; 
int STDFd; 
int outFileFd; 

    outFileFd = creat(outputFile, O_RDWR); 

    printf("creat returned %x as a file desc\n",outFileFd); 

    if (outFileFd != -1) 
    { 
    STDFd=ioGlobalStdGet(STD_OUT); 
     ioGlobalStdSet(STD_OUT,outFileFd); 
     rtn=execute(shellCmd); 
    if (rtn !=0) 
    printf("execute returned %d \n",outFileFd); 
     ioGlobalStdSet(STD_OUT,STDFd); 

    } 
    close(outFileFd); 
    return (rtn); 
} 
+0

Quelle version de vxWorks? – indiv

Répondre

2

Si cela est une coquille cible/du noyau (à savoir en cours d'exécution sur la cible elle-même), alors souvenez-vous que toutes les commandes shell sont simplement convertis en appels de fonction.

Ainsi "ls" est vraiment un appel à ls(), qui je crois est déclaré dans dirLib.h

+0

Cela est vrai. Je peux penser à peu de raisons d'injecter une chaîne de commande dans le shell à moins que la commande ou l'expression ne soit pas connue au moment de la compilation (peut-être que l'utilisateur a entré à partir d'un fichier de script). Cependant, le shell est capable d'effectuer une évaluation de l'expression de C en cours d'exécution, ce qui peut être utile (parfois peut-être). – Clifford

+0

Ceci est une information très utile. – Jason

0

Comme toujours, lire le documentation. ioLib.h est requis pour la plupart des fonctions utilisées dans cet exemple, et stdio.h bien sûr pour printf(). En ce qui concerne la question générale de savoir si vous devez inclure des en-têtes particuliers pour tout code à compiler, vous devez déclarer tous les symboles utilisés, et généralement cela signifie inclure les en-têtes appropriés. Le compilateur vous dira bientôt quels sont les symboles non définis, soit par avertissement ou par erreur (dans C89/90, les fonctions non définies ne sont pas une erreur, juste une mauvaise idée).

+0

Merci pour vos commentaires. Je suis un novice vxworks complet qui est peut-être pourquoi j'ai eu du mal à trouver l'api. (Je sais que c'est ridicule) Quoi qu'il en soit, merci pour le lien, cela devrait beaucoup aider. – Jason

+0

@Jason: Je viens juste de trouver cette copie de la documentation de VxWorks par Google. Plutôt se fier à une copie hébergée par l'université de la documentation probablement ancienne, vous devez utiliser la documentation fournie avec vos outils de développement VxWorks et votre licence. Vous pouvez également accéder à la documentation officielle en ligne à l'adresse http://www.windriver.com/support/ – Clifford

1

J'ai trouvé le segment de code ci-dessous travaillé pour moi. Pour une raison quelconque, la modification de globalStdOut n'a pas fonctionné. De plus, la fonction d'exécution n'a pas fonctionné pour moi. Mais en définissant la tâche spécifique sur mon fichier, j'ai pu obtenir les données dont j'avais besoin.

/* This function directs the output from the devs command into a new file*/ 

int devsToFile(const char * outputFile) 
{ 
    int stdTaskFd; 
    int outputFileFd; 

    outputFileFd = creat(outputFile, O_RDWR); 

    if (outputFileFd != ERROR) 
    { 
     stdTaskFd = ioTaskStdGet(0,1); 
     ioTaskStdSet(0,1,outputFileFd); 
     devs(); 
     ioTaskStdSet(0,1,stdTaskFd); 
     close(outputFileFd); 
     return (OK); 
    } 
    else 
     return (ERROR); 
} 
Questions connexes