2011-05-12 152 views
3

我在C语言中执行shell命令时遇到了问题。我想在C中执行shell命令,然后捕获shell命令的输出并进一步处理输出。我使用下面的代码来执行功能。但是,问题是当shell命令不会返回任何输出时,fgets()会返回垃圾信息?例如,如果/ etc/version包含','分隔值,shell返回输出,fgets返回shell命令返回的值,但是当/ etc/version不包含','时,分离的值,shell不返回任何值,fgets返回垃圾信息。有没有解决这个问题的方法,或者是否有任何其他解决方案在C和capture shell命令输出中执行shell命令?如何在C中执行shell命令?

char return_val[256]; 
FILE *fp = NULL; 
char line[256]; 
memset (return_val, 0, 256); 
/* set the defalut value */ 
strncpy (return_val, "N/A", 4); 
char cmd[] = "if [ -f /etc/umts2100_version ]; then cut -d, -f1 -s /etc/umts2100_version ; fi"; 

/* Open the command for reading. */ 
fp = popen(cmd, "r"); 
if (fp != NULL) 
{ 
    /* read the line from file */ 
    fgets (line, 256, fp); 
    if(line != NULL) 
    { 
      /* copy the data */ 
      strncpy(return_val, line, strnlen (line, 256)); 
     } 
     /* close the file */ 
    pclose (fp); 
} 

回答

2

您需要检查fgets的返回值。您正在测试的指针永远不会为NULL,因为Fgets不会更改其参数。

if (fgets (line, 256, fp) == NULL) { 
    // read failed 
} 
+0

嗨,我试着你有什么建议。建议解决方案的问题是,如果流的字节数小于255(考虑它只有2个字节),则fgets返回NULL,但将2个字节的内容复制到行中。如果我错了,请纠正我。 – Ravi 2011-05-12 12:54:48

+0

@Ravi这两个字节是一行吗?换句话说,他们最终是否有\ n?如果不是,你可能不得不用fread或fgetc而不是fgets来读取流。 – 2011-05-12 13:27:33

+0

感谢您的回复。在线的末尾我不认为\ n存在。 fp到达文件结尾,这就是原因,fgets()返回NULL。我认为fgetc()是更好的选择。 – Ravi 2011-05-13 06:37:16