我正在通过execvp执行bash脚本,但脚本会在中途停止执行。
看看我的代码:
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脚本。
我正在运行,因此在debian 8.6的beaglebone黑色系统(am335x)上测试了该程序。
答案 0 :(得分: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
然后编辑&#39; rtest.sh&#39;包含:
#!/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目录的权限。
我第一次运行程序时生成的&#39; out.txt文件包含
1
2
3
4
5
每次连续运行都会将上述输出的重复附加到&#39; out.txt&#39;