【问题标题】:c program (linux): get command line output to a variable and filter datac程序(linux):获取命令行输出到变量并过滤数据
【发布时间】:2012-08-17 12:33:00
【问题描述】:

我有一个运行以下命令的 c 程序:

system("sudo grep '' /sys/class/dmi/id/board_*")

并在命令行上给出输出。

我希望将输出存储在 c 程序中的某个变量中,以便我可以过滤 board_serial

【问题讨论】:

  • 你真的在使用grep '' /sys/class/dmi/id/board_*吗?还是您故意遗漏了搜索字符串?如果这真的是您正在做的事情,cat /sys/class/dmi/id/board_* 会更好。或者更好的是,每个文件只需要fopen()(尽管您必须自己处理通配符位,这是使用system() 方法的一个“好处”)。

标签: c command-line variable-assignment


【解决方案1】:

看看popen。下面是一个简单示例,说明如何使用它来捕获程序输出:

#include<stdio.h>

int main()
{
    FILE *p;
    p = popen("ls -l", "r");

    if(!p) {
        fprintf(stderr, "Error opening pipe.\n");
        return 1;
    }

    while(!feof(p)) {
        printf("%c", fgetc(p));
    }

    if (pclose(p) == -1) {
        fprintf(stderr," Error!\n");
        return 1;
    }

    return 0;
}

但是,您似乎只是想从文件中读取一些值,对吗?我宁愿只打开(fopen())其中包含值的文件并将这些值读取到我的 C 程序中的变量中。尝试这样的事情(只是一个简单的例子):

#include<stdio.h>
#include<stdlib.h>

#define MAX 100

int main()
{
    FILE *fp;
    char result[MAX];
    int i;
    char c;

    fp = fopen("/sys/class/dmi/id/board_name", "r");

    if(!fp) {
        fprintf(stderr, "Error opening file.\n");
        return 1;
    }

    i = 0;
    while((c = fgetc(fp)) != EOF) {
        result[i] = c;
        i++;
    }
    result[i] = '\0';

    printf("%s", result);
    i = atoi(result);
    printf("%d", i);

    if (fclose(fp) == -1) {
        fprintf(stderr," Error closing file!\n");
        return 1;
    }

    return 0;
}

【讨论】:

    【解决方案2】:

    最简单的方法是将输出重定向到一个文件并读取该文件以解析输出。

    system("sudo grep '' /sys/class/dmi/id/board_* 1>out.txt 2>err.txt");
    fd_out = fopen("out.txt", "r");
    fd_err = fopen("err.txt", "r");
    

    或者你可以使用popen 函数。

    fd_out = popen("sudo grep '' /sys/class/dmi/id/board_*", "r");
    

    【讨论】:

    • 恕我直言,解决这个问题的最佳方法是使用fopen() 打开文件并将其内容读取到变量中。看起来用户只是想读取一个文件。
    【解决方案3】:

    使用 dup 或 dup2 将标准输出 fd 复制到文件 fd

    Man dup/dup2

    【讨论】:

      【解决方案4】:

      是的,popen 绝对是最好的选择。看看这里

             http://www.yolinux.com/TUTORIALS/ForkExecProcesses.html
      

      【讨论】:

      • 看起来用户只需要读取文件内容。查看她感兴趣的内容的文件,只有一行,里面有一个简单的字符串。
      猜你喜欢
      • 1970-01-01
      • 2012-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-16
      • 2012-09-04
      • 2014-02-02
      • 1970-01-01
      相关资源
      最近更新 更多