L'exécution d'un programme externe via system () ne fonctionne pas correctement

StackOverflow https://stackoverflow.com/questions/1612451

  •  06-07-2019
  •  | 
  •  

Question

J'essaie d'appeler un programme (ncbi blast, pour ceux qui ont besoin de savoir) à partir de mon code, en appelant la commande dans un appel system ().

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 retourne beaucoup plus rapidement, 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 que cela a quelque chose à voir avec les variables d'environnement ou le chemin d'accès ...

Le nom du fichier de sortie est donné via le paramètre de ligne de commande -o, pas la redirection de sortie.

J'ai lu quelque chose sur la possibilité que la commande popen convienne mieux à mon cas d'utilisation, mais je ne la trouve pas, de quelle bibliothèque provient-elle?

Était-ce utile?

La solution

La cause la plus courante de tels problèmes est un paramètre de variable d'environnement incorrect dans ceux ~ / .bashrc .

Vous devriez pouvoir voir ce que ncbi n’est pas satisfait en exécutant

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

Une autre façon courante de déboguer ceci est avec strace . Exécuter:

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

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

Autres conseils

Y a-t-il une raison pour laquelle vous ne souhaitez pas fourchette et exec ? C’est un langage courant pour exécuter un processus d’un autre.

popen est dans la bibliothèque C standard Voir la page de manuel

Quelques questions rapides:

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

Il est préférable de copier et coller exactement depuis votre terminal, puis une description en anglais.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top