0

私は次のコマンドを実行するacプログラムを持っています:

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

コマンドラインで出力します。

をフィルタリングできるように、出力をcプログラムの変数に格納したいと思いますboard_serial

4

4 に答える 4

2

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;
}
于 2012-08-17T14:16:16.210 に答える
0

dupまたはdup2を使用して、標準出力fdをファイルfdに複製します

Man dup / dup2

于 2012-08-17T14:27:23.100 に答える
0

はい popen は間違いなく最良の選択です。こちらをご覧ください

       http://www.yolinux.com/TUTORIALS/ForkExecProcesses.html
于 2012-08-17T17:15:24.323 に答える
0

最も簡単な方法は、出力をファイルにリダイレクトし、そのファイルを読み取って出力を解析することです。

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");
于 2012-08-17T12:56:37.863 に答える