2013-04-07 5 views
0

Je suis en train d'exécuter wget dans un processus enfant séparé que je Duplication avec une fourchette comme suit:execl avec wget, processus enfant, unix - pourquoi ça marche pas

int child; 
    pid_t child = fork(); 
if (child == 0) { // no errors 
    bool done = false; // set to false 
    while (!done) { // while not true do 
    execl("wget", "someurl", NULL); 
    done = true; // since dl finished 
} 
cout << "DL Finished\n"; // to see if child was successful 
} 
else if (child != 0) { // errors 

Toute erreur apparente que vous peut signaler dans ce code? Si c'est important, c'est dans une fonction vide que j'appelle principal ce qui se passe est qu'il ne télécharge pas et il affiche "DL Finished", mais pas exécuter wget - alors le terminal prend le relais.

Ceci est exécuté sur Ubuntu 12.04.2 LTS. J'ai précédemment dans la même fonction vide utilisé enfant pour exécuter "ls" qui fonctionne correctement, c'est-à-dire que je lui dis tout le chemin de ls (/ bin/ls). J'ai lu que ne pas fournir le chemin complet le ferait rechercher la commande, qui est ce que je veux.

+0

Essayez d'utiliser le chemin complet de wget dans l'appel exec. – suspectus

+0

Lorsque 'fork' renvoie une valeur non nulle, ce n'est pas nécessairement une erreur. La plupart du temps c'est l'identifiant de processus du nouveau processus-enfant. –

Répondre

2

Je lis que ne fournissant pas le chemin complet, il sera la recherche de la commande

Cela arrive pour execlp. De plus, par convention, le premier argument devrait être le nom de l'exécutable. Donc, vous pouvez essayer:

execlp("wget", "wget", "someurl", NULL); 
    ^  ^^^^^ 

Comme une note de côté, votre while (!done) est faux. Ce n'est pas comme ça que vous attendez qu'un programme se termine. En fait, une fois que vous appelez exec, le while est parti: un autre processus "remplace" le vôtre. Donc vous pouvez y penser "exec est une fonction qui ne revient pas". Le moyen standard est de wait(2) dans le parent jusqu'à ce que l'enfant meure.


Comme une deuxième note de côté, si tout ce que vous voulez est de wget quelque chose et attendre jusqu'à ce que le wget se fait, le system(3) est peut-être plus approprié:

system("wget someurl"); 
+0

Vous avez raison, merci! En ce qui concerne (! Done), avez-vous des astuces/suggestions sur la façon de faire attendre que le téléchargement se termine? (ajoutera comme réponse une fois que je suis autorisé) – dusz

+0

@dusz Ne pas le marquer comme accepté pour le moment! Attendez un peu plus, peut-être que de meilleures réponses se présentent. – cnicutar

+0

Je vais attendre un peu comme vous avez suggéré :) – dusz

1

Les arguments que vous passez à execl sont quel sera le tableau argv au nouveau processus main fonction. Et comme vous le savez la première entrée dans argv est le nom du programme lui-même.

Donc ce que vous devez faire est:

execlp("wget", "wget", "someurl", NULL); 

Aussi, si tout allait bien la famille exec de la fonction ne retourne pas, de sorte que tout code après l'appel exec ne fonctionnera pas.

Questions connexes