2013-05-14 68 views
1

我有以下功能我的函數填充字符串值

void runSysCall(char *command, char *output) 
{ 

    FILE *cmdline = popen(command, "rb"); 
    size_t size = 0; 


    while(getdelim(&output, &size, 0, cmdline) != -1); 

    fclose(cmdline); 
} 

我從這個功能,什麼都我回國爲空調用它。

char * getVendorOfTheProcesses() 
{ 

    char * result = 0; 
    runSysCall("cat /proc/cpuinfo | grep -i 'Model'", result); 

    printf("%s", result); 
    return "asdsd"; 
} 

如果您從函數中打印結果值,它會給出打印結果。

請任何幫助,將不勝感激。

+1

你可能是指'getdelim(output,&size,0,cmdline)'。確保啓用所有編譯器警告。 – 2013-05-14 18:04:42

+0

@KerrekSB - 是和否:'getdelim'需要'char **'作爲第一個參數。但'output'只是'char *'。 – Roddy 2013-05-14 21:07:16

回答

1

請改變你的

FILE *cmdline = popen(command, "rb"); 

FILE *cmdline = popen(command, "r"); 

,它工作(我測試了它 - http://ideone.com/agV18s)。

http://pubs.opengroup.org/onlinepubs/009696899/functions/popen.html

mode參數popen方法()是指定I/O模式的字符串:

如果模式爲r,當子進程啓動時,它的文件描述符 STDOUT_FILENO應該是管道的可寫入端,並且調用進程中的文件描述符fileno(流),其中stream是由popen()返回的 流指針,應爲 管道的可讀端。

如果模式爲w,當孩子處理開始時其文件描述符 STDIN_FILENO應管的可讀端,並且在呼叫過程中,其中流是 流指針文件 描述符的fileno(流)由popen()返回的,應爲 管道的可寫端。

如果mode是任何其他值,結果是未定義的。

看來你使用的是b模式導致的問題(或者得到未定義的行爲)。您也可以使用free來避免內存泄漏。

另請注意,runSysCall的每次迭代將覆蓋output。因此,在您的getVendorOfTheProcesses當您打印result時,您將獲得null,因爲這是最後一次讀取的內容。因此,您必須確保您追加每行並將其返回至runSysCall而不是使用result

我改變了一下你的代碼來結合我的意思 - http://ideone.com/QVTjiD 這只是一個例子,你應該根據自己的需要調整它,並納入內存管理。

要驗證你的代碼工作正常(我的機器上的數是128,你可能會有所不同),您可以使用類似如下:

$ cat /proc/cpuinfo | grep -i 'Model' | wc -l 
128 
$ ./a.out | wc -l 
128 

希望它能幫助。

+0

你的第一個ideone有缺陷:'printf(「%s」,result);'正在寫'(null)'! – Roddy 2013-05-14 21:50:24

+0

@Roddy它不是瑕疵,它是@Alibaba所擁有的。我在回答的後半部分解釋了爲什麼它是'空'(因此代碼中存在缺陷)以及它如何修復。另請參閱第二個'ideone'(http://ideone.com/QVTjiD),它顯示了一種解決問題的方法。 – Bill 2013-05-14 23:13:32

0

我想你還沒有明白getdelim的工作原理。它的第一個參數是char**,它用於返回char *。所以,你應該runSysCall相同的方式工作: -

void runSysCall(char *command, char **output) 
{ 
    .... 
    while(getdelim(output, &size, 0, cmdline) != -1); 
    ... 
} 

現在,當你調用runSysCall第二PARAM必須char**型的,所以...

char * getVendorOfTheProcesses() 
{ 
    char * result = 0; 
    runSysCall("cat /proc/cpuinfo | grep -i 'Model'", &result); 

    return result; 
} 

注意,指針從返回getVendorOfTheProcess在內部被malloc'd getdelim。爲了避免泄漏,您必須在致電getVendorOfTheProcess()後致電free()

您現在應該可以得到您期望的結果。