Мне нужно запустить скрипт оболочки из кода C ++ на компьютере с Linux. Я пытался использовать функции system () и popen (). Когда я тестирую их на компьютере разработчика, все работает нормально, но когда я пробую те же функции на реальном устройстве — я получаю ошибку 127. Из информации, имеющейся до сих пор, это означает, что интерпретатор сценариев недоступен, но на самом деле на компьютере установлен busybox с установленным пеплом переводчик в этом. Я могу запускать те же команды через командную строку — никаких проблем. Когда я пытаюсь сделать это из кода, я получаю:
Command: sh -n '/home/test/test.sh' Status: 127
В чем может быть причина такого поведения?
Возможно ли, что я достиг каких-то ограничений ядра?
Пример кода 1:
int Files::CallShell( std::string& command )
{
int status = 0;
char buff[512] = { 0 };
FILE *in;
if ( !(in = popen( command.c_str(), "r") ) )
{
printf( "Can't execute: %s\n", command.c_str() );
status = -1;
}
while ( fgets( buff, sizeof(buff), in) != NULL )
{
printf( "Result: %s\n", buff );
}
status = pclose( in );
status = ( WIFEXITED( status ) )? WEXITSTATUS( status ) : status;
printf("Command: %s Status: %d\n", command.c_str(), status );
return status;
}
Пример кода 2:
int Files::CallShell2( std::string& command )
{
int status = 0;
status = system( command.c_str() );
status = ( WIFEXITED( status ) )? WEXITSTATUS( status ) : status;
printf("Command: %s Status: %d\n", command.c_str(), status );
return status;
}
system()
библиотечная функция выполняется /bin/sh -c
для запуска команда прошла. Если /bin/sh
не существует, или если ash
не анализирует параметры таким же образом, вы получите эту ошибку. Вы можете быть в состоянии любую ссылку /bin/sh
в /bin/ash
или, возможно, лучше реализовать свою собственную версию system()
с fork()
и один из exec
семейство функций, которые могут вызывать ash
скорее, чем sh
,
Ключ «-n» используется для проверки синтаксиса сценариев оболочки … если «-i» не установлен. Проверьте страницу руководства оболочки. Что касается проверки статуса выхода. Со страницы руководства:
СТАТУС ВЫХОДА
Ошибки, обнаруженные оболочкой, такие как синтаксическая ошибка, приведут к
оболочка для выхода с ненулевым статусом выхода. Если оболочка не является
интерактивная оболочка, выполнение файла оболочки будет прервано. В противном
в противном случае оболочка вернет статус завершения последней команды exe-
или если встроенная команда выхода используется с числовым аргументом,
вернуть аргумент.