C ++ exec выполняет сценарии bash останавливается случайным образом

Я выполняю сценарий 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.

0

Решение

вот что я сделал, чтобы эта программа работала:

Примечание: я переписал это на 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’

0

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector