Я выполняю сценарий bash через execvp, но сценарий останавливается на полпути.
Посмотрите на мой код:
int main()
{
char* params[2];
//First Parameter has to be the executable path
params[0] = (char*) ::malloc(sizeof(char) * 40);
::strcpy(params[0], "/home/test.sh");
//execv needs an null pointer as last argument
params[1] = NULL;
//Execute target executable
::execvp(params[0], params);
//Only if ::exec() returns: output error
std::cout << "Exec Failed!";
exit(1);
}
Я использовал следующий bash-скрипт для тестирования:
#!/bin/bash -vx
echo "1" >> /home/out.txt
echo "2" >> /home/out.txt
echo "3" >> /home/out.txt
echo "4" >> /home/out.txt
echo "5" >> /home/out.txt
exit 0
В большинстве случаев сценарий даже не выполняется, это означает, что файл не создается или ничего не записывается в существующий файл. Иногда, однако, скрипт выполняется частично или даже полностью, то есть текстовый файл содержит
1
вплоть до
1
2
3
4
5
Но независимо от того, что происходит внутри скрипта bash, приложение всегда выходит с кодом ошибки 0.
Почему это происходит?
Если я выполняю скрипт bash вручную, все работает нормально, каждый раз доходя до конца моего скрипта. Поэтому я предполагаю, что это должно что-то делать с моим вызовом execvp вместо bash-скрипта.
Я работаю, поэтому протестировал программу на системе beaglebone black (am335x) с Debian 8.6.
вот что я сделал, чтобы эта программа работала:
Примечание: я переписал это на C
Предлагаемый код C:
#include <stdio.h> // perror()
#include <stdlib.h> // exit()
#include <string.h> // strcpy()
#include <unistd.h> // execvp()int main( void )
{
char* params[2];
//First Parameter has to be the executable path
params[0] = "/home/rkwill/rtest.sh";
//execv needs an null pointer as last argument
params[1] = NULL;
//Execute target executable
execvp(params[0], params);
perror( "execvp failed" );
exit(1);
}
затем в моем каталоге пользователя: / home / rkwill /
touch rtest.sh
затем отредактировал ‘rtest.sh’, чтобы он содержал:
#!/bin/bash -vx
# generate file if not already in existence
touch /home/rkwill/out.txt
echo "1" >> /home/rkwill/out.txt
echo "2" >> /home/rkwill/out.txt
echo "3" >> /home/rkwill/out.txt
echo "4" >> /home/rkwill/out.txt
echo "5" >> /home/rkwill/out.txt
exit 0
Затем сделал исполняемый скрипт bash через
chmod 777 rtest.sh
Примечание: я использовал каталог / home / rkwill, потому что у меня нет разрешения на запись в каталог / home.
при первом запуске программы полученный файл out.txt содержал
1
2
3
4
5
каждый последующий прогон добавлял повтор вышеприведенного вывода в ‘out.txt’
Других решений пока нет …