【问题标题】:How to execute shell command in C?如何在C中执行shell命令?
【发布时间】:2011-08-23 22:37:20
【问题描述】:

我在 C 中执行 shell 命令时遇到问题。我想在 C 中执行 shell 命令,然后捕获 shell 命令的输出并进一步处理输出。我使用以下代码来执行该功能。但是,问题是当shell命令不返回任何输出时,fgets()返回垃圾信息?

举例说明,如果/etc/version包含','分隔值,shell返回输出,fgets返回shell命令返回的值,但是当/etc/version不包含任何','分隔时值,shell 不返回任何值, fgets 返回垃圾信息。是否有解决此问题的方法,或者是否有任何替代解决方案可以在 C 中执行 shell 命令并捕获 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);
}

【问题讨论】:

    标签: c linux


    【解决方案1】:

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

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

    【讨论】:

    • 嗨,我尝试了你的建议。建议的解决方案的问题是,如果流少于 255 个字节(考虑它只有 2 个字节), fgets 返回 NULL 但将 2 个字节的内容复制到行中。如果我错了,请纠正我..
    • @Ravi 这两个字节是一行吗?换句话说,他们最后有一个 \n 吗?如果没有,您可能必须使用 fread 或 fgetc 而不是 fgets 来读取流。
    • 感谢您的回复。我不认为 \n 存在于行尾。 fp 到达文件末尾,这就是 fgets() 返回 NULL 的原因。我认为 fgetc() 是更好的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-03
    • 1970-01-01
    • 2014-06-12
    • 2015-09-26
    • 2010-12-25
    • 2019-02-18
    • 1970-01-01
    相关资源
    最近更新 更多