【问题标题】:How to execute a bash command in C and retrieve output?如何在 C 中执行 bash 命令并检索输出?
【发布时间】:2011-12-28 01:35:59
【问题描述】:

我正在尝试从 c 执行 bash 命令并检索并显示结果。 我已经尝试过使用系统,但它不起作用。 我的代码如下:

char command[200];
sprintf(command,"lsof -iTCP:%d | cut -d\"\" -f1 | tail -1",port);
printf("Port %d is open\n and is listened by %s",port,system(command));

请帮忙。我需要这个。

【问题讨论】:

  • 考虑重新表述这个问题,以便清楚您实际上并不是在尝试启动 bash 命令,而是实际上想要找到侦听特定端口的进程(来自 c++)跨度>
  • 我正在尝试运行 bash 命令。找不到正在侦听端口的服务
  • 好的,谢谢你解决这个问题

标签: c linux bash


【解决方案1】:

编辑除了实际的问题,我会使用

sudo netstat -tlpn

(显示正在侦听 TCP 端口的进程,而不是解析端口/地址)

也许将它与一些 grep 结合起来:

sudo netstat -tlpn | grep :7761

找到监听端口 :7761 的位置?


您可以使用popen

使用 popen,您可以获得异步接收流程输出的好处(如果答案在输出的第一行,您将能够停止处理,而无需等待子流程完成;只需 pclose 和子进程将因SIGPIPE 而死

直接来自Standards Documentation的示例:

以下示例演示了使用popen()pclose() 执行命令ls * 以获得当前目录中的文件列表:

#include <stdio.h>
...


FILE *fp;
int status;
char path[PATH_MAX];


fp = popen("ls *", "r");
if (fp == NULL)
    /* Handle error */;


while (fgets(path, PATH_MAX, fp) != NULL)
    printf("%s", path);


status = pclose(fp);
if (status == -1) {
    /* Error reported by pclose() */
    ...
} else {
    /* Use macros described under wait() to inspect `status' in order
       to determine success/failure of command executed by popen() */
    ...
}

【讨论】:

  • 快吗?我扫描了很多端口
  • @Baden Sorin - 你正在启动一个 bash shell 和 3 个其他程序,以及所有相关的管道,所有这些都必须被带入内存,运行,然后在最后再次分解.不,这不是“快”。根据您正在做的事情,它可能“足够快”,但如果不是,问题不在于“从 shell 获取数据”部分,而在于“运行 shell 命令”部分。如果您需要更快的速度,那么您需要找到一种方法来做到这一点,而无需花费大量精力。
  • @Michael Kohne 问题是我需要检索正在侦听特定端口的服务。
  • @Badea Sorin - 很好,这是一种可行的方法。但是你问它是否很快,我想明确指出,从定义上讲,炮击很慢。如果你需要速度,你将不得不弄清楚如何自己做 lsof 正在做的事情,或者找到一种方法让它一次性吐出大量数据。炮轰永远不会很快。
  • @BadeaSorin:嗯——这完全不是你的问题。但是,使用netstat 编辑了我的答案,这应该对您有所帮助。 (一些 UNIX-en 不支持这个)
【解决方案2】:

system(command) 返回命令的返回码,而不是它的输出。 如果你想读取命令的输出,你应该使用popen 这会将文件描述符返回到输出,您可以像普通文件一样读取它。

【讨论】:

    猜你喜欢
    • 2013-01-01
    • 2018-01-16
    • 2011-06-20
    • 2016-03-16
    • 2016-01-29
    • 2010-10-03
    相关资源
    最近更新 更多