在功能内逐行读取和检查系统调用

时间:2019-04-23 17:35:20

标签: c

我正在主函数中运行系统调用,我想知道是否可以在主函数中逐行读取系统调用的命令行输出。

我一直在网上寻找有关如何执行此操作的任何提示或想法,但找不到任何提示或想法。需要注意的一件事是,我不希望将输出写入文件然后从该文件中读取,而是希望逐行读取命令行输出。

int main(int argc, char const *argv[]) {
    system("ls -al");
    return 0;
}

例如,在上面的代码中,我想通过此C函数打印当前目录中的所有文件。有了这些信息,我只想打印四月份已更新的信息(在第六列中以“ Apr”区分)。我可以逐行读取输出,将行拆分为一个数组,然后检查指定的列是否为“ Apr”,如果可以,怎么办?任何帮助/建议将不胜感激。

1 个答案:

答案 0 :(得分:4)

您可以像这样使用popen:

#include <stdio.h>

int main()
{
    FILE * fp = popen("ls -l", "r");
    char buf[1024];
    while (fgets(buf, 1024, fp)) {
        printf("returned: \"%s\"\n", buf);
    }
    return 0;
}

这仅显示从命令中读取每一行,您仍然需要拆分文本以执行所需的操作。

只是因为它很有趣,所以它具有一个简单的功能,可以从字符串缓冲区中获取字段:

char * get_field(char *buffer, int field)
{
    int white = 1; // simple state machine
    char *p;
    char *first = NULL;
    for (p=buffer; *p; p++) {
        if (white) {
            if (*p > ' ') {
                white = 0;
                first = p;
            }
        } else {
            if (*p <= ' ') {
                white = 1;
                field--;
                if (!field && first)
                    return strndup(first, p-first);
            }
        }
    }
    return NULL;
}

int main()
{
    FILE * fp = popen("ls -l", "r");
    char buf[1024];

    while (fgets(buf, 1024, fp)) {
        char *month = get_field(buf, 6);
        if (month) {
            printf("  month: \"%s\"\n", month);
            free(month);
        }
        char *file = get_field(buf, 9);
        if (file) {
            printf("  file: \"%s\"\n", file);
            free(file);
        }
    }
    return 0;
}

这是一种简单的蛮力方法,适用于简单的程序,并且不提供典型的split()函数的功能。但这说明了用C语言完成这种事情的一种方法。