Выполнение внешней программы через system () не выполняется должным образом
Вопрос
Я пытаюсь вызвать программу (ncbi blast, для тех, кому нужно знать) из моего кода, вызывая команду в вызове system().
Если я выполняю строку непосредственно в командной оболочке, она работает так, как задумано, но если я пробую ту же строку через system(), программа возвращается намного быстрее, без ожидаемых результатов.Выходной файл создан, но размер файла равен 0.Возвращаемый код ошибки также равен 0.Я даже пытался добавить "> output.log 2> error.log", но эти файлы не были созданы.
Я предполагаю, что это как-то связано с переменными окружения или путем...
Имя выходного файла задается через параметр командной строки -o, а не через перенаправление вывода.
Я читал что-то о том, что команда popen, возможно, лучше подходит для моего варианта использования, но я не могу ее найти, из какой это библиотеки?
Решение
Наиболее распространенная причина таких проблем - неправильная установка переменных окружения в ~ / .bashrc
.
Вы сможете увидеть, что ncbi
не устраивает, выполнив
$SHELL -c '<exact string you pass to system()>'
Еще один распространенный способ отладки - strace
. Выполнение:
strace -fo /tmp/strace.out ./myProgram
и найдите в /tmp/strace.out
подсказки.
Другие советы
Есть ли причина, по которой вы не хотите использовать fork
и exec
? Это обычная идиома для выполнения одного процесса из другого.
popen находится в стандартной библиотеке C см. справочную страницу
Несколько коротких вопросов:
- Как вы выполняете in в командной оболочке?
- Как вы выполняете системную команду?
- Какое значение возвращает система?
Точное копирование и вставка из вашего терминала предпочтительнее, чем описание на английском языке.