2011-11-13 115 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的答案。 –