2009-10-28 9 views
1

Je veux faire un programme C++ et j'utilise la fonction popen ici pour envoyer des commandes à la ligne de commande sous Unix. Cela fonctionne très bien, mais quand j'appelle cd directory, le répertoire ne change pas. Je pense que c'est la même chose quand j'essaie d'exécuter cd directory dans un script, après avoir terminé le chemin du répertoire du script. Donc, les scripts que je dois exécuter comme . ./script.sh pas ./sript.sh, mais comment faire cela avec popen fonction? J'ai essayé d'ajouter ". " avant le premier argument de popen, mais en cours d'exécution ". ls" fait une erreur.Rester dans le répertoire avec popen

code:

cout << "@ Command from " << session->target().full() << ": " << message.body() << endl; 
//cout << "Prisla zprava" << endl; 
//m_session->send("Hello World", "No Subject"); 
//system(message.body().c_str()); 
//if (message.body() == "") 
FILE* outp; 
char buffer[100]; 
string outps = ""; 
outp = popen(message.body().c_str(), "r"); 
while (!feof(outp)) 
{ 
    fgets(buffer, 100, outp); 
    outps = outps + buffer; 
} 
pclose(outp); 
cout << "& Output from command: " << outps << endl; 
m_session->send(outps.c_str(), "Output"); 

Dans message.body(); est string que je veux courir (je reçois ce de XMPP). Lorsque le string est par exemple "ls", il renvoie string avec la liste des fichiers dans le répertoire réel. Mais quand le message est "cd directory", rien ne se passe, comme essayer de changer de répertoire dans les scripts.

+0

Comment allez-vous chandging répertoire? (un exemple de code pourrait être utile) – Mark

+0

Comment changer le répertoire dans le programme? –

+0

Il y a un exemple de code où je l'utilise. Ici j'essaie d'ajouter "."comme lors de l'exécution de scripts, mais". ls "fait une erreur sans". "le répertoire ne changera pas –

Répondre

5

Généralement, la commande popen() exécute la commande via le shell. Alors, ça ouvre un tuyau, et des fourches. L'enfant fait une tuyauterie (reliant le tuyau à l'entrée standard ou la sortie standard - en fonction du drapeau) et exécute ensuite

execl("/bin/sh", "/bin/sh", "-c", "what you said", (char *)0); 

Alors, comment tout cela se comporte va dépendre de vos variables clés de l'environnement - notamment PATH .

Si vous voulez exécuter un script dans le répertoire courant, puis une de ces options:

outp = popen("./script.sh", "r"); 
outp = popen("sh -x ./script.sh", "r"); 
outp = popen("sh -c './script.sh arg1 arg2'", "r"); 

Si vous voulez exécuter la commande « ls »:

outp = popen("/bin/ls /the/directory", "r"); 

Et si vous vouloir changer de répertoire avant d'exécuter quelque chose:

outp = popen("cd /somewhere/else; ./script", "r"); 

Et ainsi de suite ..

Si vous voulez changer le répertoire du programme qui utilise popen(), alors vous devez utiliser l'appel système 'chdir()' (ou éventuellement fchdir()). Si vous pensez que vous pourriez vouloir revenir là où vous avez commencé, utilisez:

int fd = open(".", O_RDONLY); 
chdir("/some/where/else"); 
...do stuff in new directory 
fchdir(fd); 

(, vous avez besoin De toute évidence une erreur de vérification dans ce lot.)

0

Il semble que vous ayez un peu de code que vous ne comprenez pas. Vous êtes lecture de outp, un tuyau. Nommer une entrée tuyau outp est plutôt déroutant. Vous prenez ensuite la chaîne que vous avez lu et la transmettez à m_session->send().

Vous n'interagissez nulle part dans ce processus avec la ligne de commande Unix. En particulier, popen() ne l'est pas.

+1

Non, vous ne le comprenez pas J'ai une chaîne dans message.body() ;. Je crée un fichier nommé * outp (c'est outp parce que ici je reçois la sortie de la fonction popen). J'appelle la fonction popen, la fonction popen prend la chaîne de l'argument, la donne au système Unix et la sortie de cette commande donne à outp Donc si je veux appeler "ls" dans le programme C++, j'appelle popen ("ls" , "r") et la sortie de ls est dans le fichier, qui retourne popen.Il fonctionne.Mais cela ne fonctionne pas avec "répertoire cd", comme si vous essayez d'appeler "répertoire cd" à partir de certains scripts bash –

+0

Si vous obtenez le _output_ d'un autre programme, c'est _input_ pour vous. – MSalters

Questions connexes