【问题标题】:How to get output from Linux command via C/C++? and suitable for android?如何通过 C/C++ 从 Linux 命令获取输出?并且适合安卓?
【发布时间】:2013-02-16 08:25:03
【问题描述】:

我尝试运行 Linux 命令并使用 C/C++ 代码从中读取输出。 我搜索 exec 但这不处理输入/输出。

我想要实现的是通过使用此命令iwconfig,从 C/C++ 代码中调用它来获取有关无线 LAN 的信息。

我还需要一个合适的代码来使用 NDK 将其用作 android 的 lib。

我在android开源中看到他们称之为这个函数

你觉得这段代码怎么样?

int wpa_ctrl_request(struct wpa_ctrl *ctrl, const char *cmd, size_t cmd_len,
                 char *reply, size_t *reply_len,
                 void (*msg_cb)(char *msg, size_t len))
                {
        DWORD written;
        DWORD readlen = *reply_len;

if (!WriteFile(ctrl->pipe, cmd, cmd_len, &written, NULL))
    return -1;

if (!ReadFile(ctrl->pipe, reply, *reply_len, &readlen, NULL))
    return -1;
*reply_len = readlen;

return 0;

}

这是 link

【问题讨论】:

  • 结果是什么意思?输出流还是返回码?
  • 它不是由 C/C++ 代码调用的,它是非此即彼的。你用什么命令发出iwconfig?那将是第一个查看您是否可以获得返回值的地方
  • 命令的返回值,在我的例子中是无线局域网的信息。
  • 你不想要结果,你想要输出。
  • 我不知道,但我需要此命令返回的信息@

标签: android c++ c linux android-ndk


【解决方案1】:

您可以尝试运行命令并将结果输出到文件,然后读取它

system("iwconfig > temp.txt");
FILE *fp=fopen("temp.txt","w");

【讨论】:

  • +1 不错且简单的解决方案(并不是说popen() 会达到同样的效果,但使用起来更复杂)...
  • fp 将只是一个文件句柄。您可以像通常使用 scanf() 一样使用 fscanf() 来阅读它。我建议你谷歌一个基本的 C 文件阅读教程
  • @DondonAli 使用fp,您可以从"iwconfig > temp.txt"call 生成的文件中读取字符串信息。您需要使用read()fp 读取它(管道文件句柄相同)。
  • @g-makulik 相反,popen() 比 system() 更安全,并且提供更好的控制。唯一反对,如果有的话,popen 可以是,popen 不是标准 C 的一部分。但我是 POSIX 爱好者 ;-)
  • 这种方法存在巨大的并发问题。正确解决它比使用popen 更复杂,因此最好完全避免这种解决方案。只需为工作使用正确的工具:popen
【解决方案2】:

我在android开源中看到他们称之为这个函数

你觉得这段代码怎么样?

int wpa_ctrl_request(struct wpa_ctrl *ctrl, const char *cmd, size_t cmd_len,
                     char *reply, size_t *reply_len,
                     void (*msg_cb)(char *msg, size_t len))
{
    DWORD written;
    DWORD readlen = *reply_len;

    if (!WriteFile(ctrl->pipe, cmd, cmd_len, &written, NULL))
        return -1;

    if (!ReadFile(ctrl->pipe, reply, *reply_len, &readlen, NULL))
        return -1;
    *reply_len = readlen;

    return 0;
}

这是 link

【讨论】:

  • 与您一直在询问的内容并没有真正紧密相关。这里的关键是如何处理ctrl->pipe,以及在读取管道输出的命令时如何检索(解析)信息。为避免投票,您最好将此示例附在您的问题中......
  • 如果我使用这个答案系统("iwconfig > temp.txt"); 文件 *fp=fopen("temp.txt","w");如何从 fp 中获取字符串值?
  • @ShafikYaghmour 是的,我需要此代码通过 NDK 将其与 android 连接。
  • @DondonAli 那么这会改变我对 dup 的投票,也请编辑问题以说明您正在寻找一个 android 解决方案。
  • '如果我使用这个答案系统("iwconfig > temp.txt"); ...' 要从FILE* 指针获取字符串,请参阅fgets() 函数文档。
猜你喜欢
  • 2021-10-13
  • 1970-01-01
  • 2011-07-30
  • 2010-09-18
  • 2014-11-15
  • 2013-03-23
  • 2012-09-23
  • 2010-10-03
相关资源
最近更新 更多