我试图从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));
请帮助。我需要这个 。
我试图从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));
请帮助。我需要这个 。
编辑除了实际的问题,我会用
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问题是我需要检索正在监听特定端口的服务。 –
考虑重新措辞的问题,这样就很明显,你实际上并不试图启动一个bash命令,但实际上想要找到在特定端口上侦听进程(来自C++) – sehe
我试图运行一个bash命令。没有找到正在监听端口的服务 –
好的,谢谢你的清理,那个up – sehe