2009-10-23 13 views
0

J'essaie d'appeler un programme (ncbi blast, pour ceux qui ont besoin de le savoir) depuis mon code, en appelant la commande dans un appel system().L'exécution du programme externe via system() ne fonctionne pas correctement

Si j'exécute la chaîne directement dans le shell, cela fonctionne comme prévu, mais si j'essaie la même chaîne via system(), le programme revient beaucoup plus vite, sans les résultats escomptés. Le fichier de sortie est créé, mais la taille du fichier est 0. Le code d'erreur renvoyé est également 0. J'ai même essayé d'ajouter "> output.log 2> error.log" mais ces fichiers ne sont pas créés.

Je suppose qu'il a quelque chose à voir avec les variables d'environnement ou le chemin ...

Le nom du fichier de sortie est donnée par -o paramètre de ligne de commande, pas la redirection de sortie. J'ai lu quelque chose à propos de la commande popen étant peut-être mieux adapté à mon cas d'utilisation, mais je ne peux pas le trouver, de quelle bibliothèque s'agit-il?

+0

Vous avez essayé de spécifier le chemin d'accès complet au programme dans l'appel system()? – moonshadow

+0

Comment lancez-vous l'application parente? – Bernard

+0

@moonshadow oui, le chemin complet est spécifié pour le système() appel – brandstaetter

Répondre

1

La cause la plus courante de ces problèmes est le réglage incorrect de la variable d'environnement dans les ~/.bashrc.

Vous devriez être en mesure de voir ce que ncbi est mécontent en exécutant

$SHELL -c '<exact string you pass to system()>' 

Une autre manière courante de déboguer est avec strace. Exécuter:

strace -fo /tmp/strace.out ./myProgram 

et regarder dans /tmp/strace.out des indices.

+0

Je vais jeter un coup d'oeil à ça, merci! – brandstaetter

0

popen est dans la bibliothèque standard C See the man page

+0

Merci.Malheureusement, swapping system() avec des appels popen() similaires n'a pas produit les résultats souhaités. En utilisant popen(), j'ai essayé de regarder les messages d'erreur possibles ou toute sortie, sans succès. – brandstaetter

+0

Par intérêt, y a-t-il une raison pour laquelle vous ne pouvez pas appeler le programme directement? J'ai googlé le programme que vous avez mentionné, je ne peux pas dire que c'est mon domaine! –

+1

Si system() ne fonctionne pas, l'utilisation de popen() ne résoudra pas le problème. Si cela fonctionnait avec system() alors swapper sur popen() serait probablement préférable. –

0

Quelques questions rapides:

  • Comment exécutons-vous dans la coquille?
  • Comment exécutez-vous la commande système?
  • Quelle est la valeur retournée par le système?

La copie exacte et coller de votre terminal est préférable, puis une description en anglais.

1

Y at-il une raison pour laquelle vous ne voulez pas fork et exec? C'est un idiome commun pour exécuter un processus d'un autre.

+0

Je vais essayer, merci. – brandstaetter