2009-04-17 38 views
2

我正在開發一個使用execvp執行程序的程序。它需要捕獲子進程的結果並在主進程中解析它們。似乎有一種方法,使用命名管道和複製。我試圖尋找一個很好的例子,但迄今沒有運氣。如果任何人有任何關於此的指針,鏈接和/或建議,我將不勝感激。如何捕獲execvp的輸出

+0

相關:[get命令的輸出管道,C爲Linux(http://stackoverflow.com/questions/219138/) – ephemient 2009-04-17 21:32:45

回答

5

您不需要命名管道;無名管道工作得很好。實際上,您經常可以自己使用popen而不是自己做pipe/fork/dup/execpopen是這樣的(雖然你libc的實現可能有更多的錯誤檢查):

FILE *popen(const char *command, const char *type) { 
    int fds[2]; 
    const char *argv[4] = {"/bin/sh", "-c", command}; 
    pipe(fds); 
    if (fork() == 0) { 
     close(fds[0]); 
     dup2(type[0] == 'r' ? 0 : 1, fds[1]); 
     close(fds[1]); 
     execvp(argv[0], argv); 
     exit(-1); 
    } 
    close(fds[1]); 
    return fdopen(fds[0], type); 
} 

這將創建一個未命名的管道,並fork秒。在孩子中,它將stdout(或stdin)重新附加到管道的一端,然後exec是孩子。父母可以簡單地從管道的另一端讀取(或寫入)。

+0

大。我已經回顧了管道是如何工作的,而且這應該是訣竅。 – 2009-04-18 01:41:37

2

難道你只是使用popen()?

0

下面是一個簡單的例子,演示了使用popen實現您的目標。只要把東西比「回聲」更有意思的命令:)

#include <stdio.h> 

int main() 
{ 
    char buf[100]; 
    int i = 0; 
    FILE *p = popen("echo \"Test\"","r"); 
    if (p != NULL) 
    { 
     while (!feof(p) && (i < 99)) 
     { 
      fread(&buf[i++],1,1,p); 
     } 
     buf[i] = 0; 
     printf("%s",buf); 
     pclose(p); 
     return 0; 
    } 
    else 
    { 
     return -1; 
    } 
}