C — системная команда

#c

#c

Вопрос:

У меня есть программа на C , которая в основном используется для обработки видео. Внутри программы я запускаю system команду для того, чтобы получить передачу обработанных видеороликов в некоторые другие двоичные файлы для их последующей обработки.

У меня цикл while стремится к бесконечности, и я каждый раз запускаю системную команду внутри цикла. Дело в том, что в определенный момент я получаю код возврата -1 от system команды. Что может быть причиной этого?

Внутри системной команды я просто вызываю двоичный файл с соответствующими параметрами из основного проекта.

system Команда, которую я хочу выполнить, на самом деле является файлом оболочки. В этом файле я извлекаю основные функции из видео и пропускаю их через SVM-модель из сторонней библиотеки 3D, чтобы получить желаемую классификацию.

 ./LiveGestureKernel ./Video ./SvmVideo
./mat4libsvm31 -l SvmVideoLabels < SvmVideo > temp_test_file
./svm-predict temp_test_file svm_model temp_output_file
cat < temp_output_file
rm -f temp_*
  

После определенного количества итераций в цикле while файл сценария просто не будет выполняться, и я не могу понять причину этого. Спасибо!

Комментарии:

1. Это зависит от вашей среды, но может быть, что выполняемая вами программа возвращает значение -1

2. Код возврата зависит от того, что вы выполняете. Нам нужно больше информации.

3. Вы пробовали искать информацию о system вызове библиотеки?

4. Запускаете ли вы эти команды постобработки с помощью amp; , чтобы они выполнялись в фоновом режиме? Возможно, у вас заканчиваются процессы.

Ответ №1:

Если вы получите -1 результат вызова system() , вам следует сначала изучить содержимое errno — это, скорее всего, подскажет вам, в чем заключается ваша конкретная проблема.

Единственное, на что следует обратить внимание, это то, что возвращаемое значение из system определяется реализацией в случае, когда вы передаете ему ненулевую команду, поэтому возможно, что -1 это может исходить из вашего реального исполняемого файла.

В этом случае лучше всего распечатать (или иным образом записать в журнал) команду, выполняемую при сбое (и, возможно, все время), чтобы вы могли проверить, что происходит с теми же аргументами, когда вы выполняете ее непосредственно из командной строки или командной оболочки.