2010-12-03 4 views
0

Comment puis-je exécuter shell à partir d'un code C?Donner le contrôle à shell à partir d'un code C?

Ma coquille est placée dans /bin/sh

Après ne semble pas fonctionner pour moi

system("/bin/sh"); 
exec("/bin/sh"); 
+0

Ne fonctionne pas? Pourriez-vous préciser ceci? Et, laquelle de la famille de fonctions exec avez-vous utilisé? – vpit3833

+0

que se passe-t-il? Plus de détails s'il vous plaît – Drakosha

+0

En fait quand je cours mon code C sans utiliser aucune de ces commandes, mon code entre dans une sorte d'état d'attente (c'est à cause de la nature de l'application C que j'utilise). J'ai essayé ces commandes avant la ligne qui le fait entrer dans l'état d'attente mais je n'obtiens aucune invite de commande. – baltoro

Répondre

2

Peut-être que vous avez besoin de dire la coquille, il doit être interactif:

system("/bin/sh -i"); 

Cependant , Je crois que votre appel system() original aurait dû produire une invite de shell aussi.

Les deux notations (avec et sans -i) dans ce programme, je l'invite du shell (retour à la coquille précédente en tapant 'exit' et RETOUR ou Control-D):

#include <stdlib.h> 
int main(void) 
{ 
    system("/bin/sh -i"); 
    return 0; 
} 
1

Ce programme fonctionne comme prévu pour moi:

int main() 
{ 
    int ret = system("/bin/sh"); 
    printf ("Shell returned %d\n", ret); 
    return 0; 
} 

à l'aide -i provoque une sorte de problème de redirection et tout se bloque dès que je tape une commande qui produit une sortie.

Il existe des différences importantes entre système() et exec(). système () est effectivement la même que /bin/sh -c yourCommand sur la ligne de commande, de sorte que le system("/bin/sh") est le même que

/bin/sh -c /bin/sh 

C'est pourquoi il est rarement utilisé, parce que la commande que vous voulez est exécuté par débutez une inutile processus shell.

exec() provoque l'image entière du processus à remplacer par la commande spécifiée si j'avais écrit:

int main() 
{ 
    int ret = exec("/bin/sh"); 
    printf ("Shell returned %d\n", ret); 
    return 0; 
} 

Le printf() et tout ce qui suit aurait jamais été exécuté parce que l'ensemble du processus se transforme en une instance de /bin/sh. La bonne façon d'exécuter une commande enfant est de fork puis d'exec dans l'enfant et d'attendre dans le parent.

Questions connexes