我試圖從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