2013-05-14 121 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()

您现在应该可以得到您期望的结果。