system () и popen () недоступны

Мне нужно запустить скрипт оболочки из кода 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;
}

2

Решение

system() библиотечная функция выполняется /bin/sh -c для запуска команда прошла. Если /bin/sh не существует, или если ash не анализирует параметры таким же образом, вы получите эту ошибку. Вы можете быть в состоянии любую ссылку /bin/sh в /bin/ashили, возможно, лучше реализовать свою собственную версию system() с fork() и один из exec семейство функций, которые могут вызывать ash скорее, чем sh,

0

Другие решения

Ключ «-n» используется для проверки синтаксиса сценариев оболочки … если «-i» не установлен. Проверьте страницу руководства оболочки. Что касается проверки статуса выхода. Со страницы руководства:

СТАТУС ВЫХОДА

Ошибки, обнаруженные оболочкой, такие как синтаксическая ошибка, приведут к
оболочка для выхода с ненулевым статусом выхода. Если оболочка не является
интерактивная оболочка, выполнение файла оболочки будет прервано. В противном
в противном случае оболочка вернет статус завершения последней команды exe-
или если встроенная команда выхода используется с числовым аргументом,
вернуть аргумент.

-1