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++ dup2 和 execl

python怎样抓取securecrt上的数据

Android 平台上的原生 C/C++ 代码

C++ 可用于 Android 和 iOS 上的 UI 开发

android 上的 QML - C++ 是不是适用于业务逻辑? [关闭]

Unity - Android, C# - C++ 内存泄漏