Android 上的 C++ 代码 - execl() 函数调用失败
Posted
技术标签:
【中文标题】Android 上的 C++ 代码 - execl() 函数调用失败【英文标题】:C++ code on Android - execl() function call failure 【发布时间】:2016-01-14 19:19:47 【问题描述】:故事 - 我在根植于 android Wear 设备上获得了一个脚本文件,我想用我的 c++ 代码运行它。
首先我尝试了这个int ret = system(/system/bin/sh /full/path/a.sh)
,结果每次system()
返回代码127 - 命令不存在错误。
我在这里找到了这个解决方法:system is returning error 127 when called from c++ in linux,我按照@Nikhilendra 所说的做:
int ret = execl("/system/bin/sh","/system/bin/sh","/full/path/a.sh",(char*)NULL)
现在我的 c++ 代码每次都在这一行崩溃,即使没有返回值,所以我无法得到任何错误代码。
非常感谢任何帮助。
EDIT1: 脚本 a.sh 本身运行正常。
EDIT2: 我的问题可以理解为system is returning error 127 when called from c++ in linux的跟进
【问题讨论】:
Nikhilendra 用三个参数做到了。 system is returning error 127 when called from c++ in linux的可能重复 @greenapps 其实这是正确的方法,Nikhilendra 没有给出完整的参数列表。execl
调用将当前过程映像替换为新的过程映像。这是故意的吗?
@MartinZabel 第一个参数是可执行文件的完整路径,其余的是被分割成片段的实际命令。见linux.die.net/man/3/execl
【参考方案1】:
如果您想使用exec
函数之一来模拟system
调用,您必须先派生一个新的子进程,因为当前进程(图像)被exec
中给出的进程替换称呼。也就是说,exec
只有在失败时才会返回。
我不能说,fork
系统调用是否适用于 Android。但是,您可以通过这个小示例检查exec
调用。我实际上是在一台 Linux 机器上测试它的。 编辑:您可能需要将sh
的路径更改为/system/bin/sh
。
a.sh
的内容:
#!/bin/sh
echo "Hello World."
C++ 测试程序的内容(称为exec_test
)。
extern "C"
#include <unistd.h>
#include <errno.h>
#include <iostream>
int main()
execl("/bin/sh","sh","./a.sh",NULL);
// execl only returns if it failed
std::cout << "errno: " << errno << std::endl;
return 0;
输出:
$ ./exec_test
Hello World.
【讨论】:
以上是关于Android 上的 C++ 代码 - execl() 函数调用失败的主要内容,如果未能解决你的问题,请参考以下文章
C++ 可用于 Android 和 iOS 上的 UI 开发