2011-11-13 39 views
3

我试图从c执行一个bash命令并检索并显示结果。 我试过用系统,但它不起作用。 我的代码如下所示:如何在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)); 

请帮助。我需要这个 。

+0

考虑重新措辞的问题,这样就很明显,你实际上并不试图启动一个bash命令,但实际上想要找到在特定端口上侦听进程(来自C++) – sehe

+0

我试图运行一个bash命令。没有找到正在监听端口的服务 –

+0

好的,谢谢你的清理,那个up – sehe

回答

5

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

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() */ 
    ... 
} 
+0

它很快?我扫描了很多端口 –

+1

@Baden Sorin @你开始了一个bash shell和3个其他程序,以及所有相关的管道,所有这些都必须被带入内存,运行,然后在最后再次分解。不,这不是'快'。取决于你在做什么,它可能'足够快',但如果不是这样,问题不在于'从shell中获取数据'部分,而在'运行shell命令'部分。如果你需要更快的速度,那么你需要找到一种方法来做到这一点,而不会出现问题。 –

+0

@Michael Kohne问题是我需要检索正在监听特定端口的服务。 –

1

系统(命令)返回命令的返回代码,而不是它的输出。 如果要读取命令的输出,应该使用popen 这会将文件描述符返回到输出,您可以像正常文件一样读取它。

+0

这是sehe的答案。 –