【问题标题】:My function filling string value我的函数填充字符串值
【发布时间】:2013-05-14 18:02:58
【问题描述】:

我有以下功能

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

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


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

    fclose(cmdline);
}

我从这个函数调用它,我返回的是 null。

char * getVendorOfTheProcesses()
{

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

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

如果您从函数打印结果值,它将给出它应该打印的内容。

如有任何帮助,我们将不胜感激。

【问题讨论】:

  • 您的意思可能是getdelim(output, &size, 0, cmdline)。确保启用所有编译器警告。
  • @KerrekSB - 是和否:getdelim 需要 char** 作为第一个参数。但output 只是char *

标签: c linux string function


【解决方案1】:

请更换你的

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

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

它可以工作(我测试过——http://ideone.com/agV18s)。

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

popen() 的模式参数是一个指定 I/O 模式的字符串:

如果mode为r,当子进程启动时,它的文件描述符 STDOUT_FILENO 应该是管道的可写端,文件 调用进程中的描述符 fileno(stream),其中 stream 是 popen() 返回的流指针,应该是 管道。

如果 mode 是 w,当子进程启动时,它的文件描述符 STDIN_FILENO 应该是管道的可读端,文件 调用进程中的描述符 fileno(stream),其中 stream 是 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

希望对你有帮助。

【讨论】:

  • 你的第一个想法有缺陷:printf("%s", result); 正在写(null)
  • @Roddy 没有缺陷,@Alibaba 就是这样。我在答案的后半部分解释了为什么它是null(因此是代码中的缺陷)以及如何修复它。另请参阅第二个ideone (ideone.com/QVTjiD),它显示了解决问题的方法。
【解决方案2】:

我认为您还没有掌握getdelim 的工作原理。它的第一个参数是char** 类型,用于返回char *。所以,你的 runSysCall 应该以同样的方式工作:-

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

现在,当您调用 runSysCall 时,第二个参数必须是 char** 类型,所以...

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

  return result;
}

请注意,从getVendorOfTheProcess 返回的指针是由getdelim 在内部分配的。为避免泄漏,如果在调用getVendorOfTheProcess() 之后,您必须free()

您现在应该得到预期的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    相关资源
    最近更新 更多