提取proc / status linux文件的一部分

时间:2015-10-17 08:38:37

标签: c arrays linux string fedora

首先,我是Linux和C语言的初学者,当涉及到字符串时,我无法将C与c ++或java联系起来。我正在使用Fedora16 - linux - 我想读取proc / [pid] / status文件以从中获取特定信息,例如PPID和state,然后我应该在屏幕上打印这些信息 - 命令行终端 - 。这必须通过在gedit中编写c脚本来完成。我唯一的问题是我是c的新手,在c中处理字符串对我来说似乎非常令人沮丧!我已经打开文件并通过执行c文件在终端上查看它。是否有任何可能的方法将整个内容存储在一个字符串变量中然后我可以将其标记化并存储数据块,如字符串数组而不是字符数组,然后我知道我想要的数据在数组中的哪个位置我可以访问它?

这是我的代码

div#mountNode

终端输出:

enter image description here

1 个答案:

答案 0 :(得分:2)

最初有两件事是错误的

  1. line不应该是const
  2. while (!feof(file))几乎总是错的。
  3. 修复涉及做类似

    的事情
    while (fscanf(file, "%199s", line) == 1)
    

    将循环,直到没有更多数据,并防止溢出line

    这会解决问题,另一件事情相当复杂,首先尝试使用fgets()代替fscanf(),它会消耗文件中的行,包括'\n'和嵌入的空格

    while (fgets(line, sizeof(line), file) != NULL)
    

    然后你可以尝试sscanf()检查它的返回值,以确保它成功。

    /proc/self/status的内容中你可以看到strchr()在分割有趣部分中的线条方面做得很好。

    这是一个例子:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <ctype.h>
    
    int
    main(void)
    {
        FILE *file;
        char line[100];
        file = fopen("/proc/self/status", "r");
        if (file == NULL)
            return -1; /* Failure to open /proc/self/stat -- very unlikely */
        while (fgets(line, sizeof(line), file) != NULL)
        {
            char *tail;
            char *key;
            char *value;
            tail = strchr(line, '\n');
            if (tail != NULL)
                *tail = '\0'; /* remove the trailing '\n' */
            tail = strchr(line, ':');
            if (tail != NULL)
            {
                tail[0] = '\0';
                key = strdup(line);
                if (key == NULL)
                    continue;
                tail += 1;
                while ((tail[0] != '\0') && (isspace((int) tail[0]) != 0))
                    tail++;
                value = strdup(tail);
                if (value != NULL)
                {
                    fprintf(stderr, "%s --> %s\n", key, value);
                    /* You could do something now with key/value */
                    free(value);
                }
                free(key);
            }
        }
    }