添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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

0 人关注

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

Here is my code though

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
void main()
const char line[200];
const char junk[200];
FILE *file = fopen("/proc/14/status", "r");
// while not end of the file
while(!feof(file)) {
fscanf(file,"%s",line); //Get text into line array
printf("%s\n", line);
//fscanf(file,"%[ \n\t\r]s",junk); //Remove any 'white space' characters
               }//end while
fclose(file);

终端上的输出。

4 个评论
关于如何编写这类代码的一般概念,见 我的答案在这里
对于C语言中的字符串,其实非常简单:它们不存在。C语言只知道 字符串 译成一个 char 的数组,末尾有一个 0 ,并且只是评估为指向其第一个 char 的指针。所以,考虑指针和数组,而不是字符串。BTW,术语 c-string 有时使用的意思正是如此:一个 char 的数组,最后是0。替换代码4】有很多函数可以对这种 "字符串 "进行基本操作,只需看一下概述。
作为最后一句话。 never scanf() 中使用一个普通的 %s ,它最终会溢出任何缓冲区,是一个安全风险。
c
arrays
linux
string
fedora
AMH9
AMH9
发布于 2015-10-17
1 个回答
Iharob Al Asimi
Iharob Al Asimi
发布于 2015-10-17
已采纳
0 人赞同

最初有两件事不对

  • line should not be const .
  • while (!feof(file)) is almost always wrong.
  • The fix involves doing something like

    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>
    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);