Извлечение части файла proc/status linux

64
7

Во-первых, я полностью новичок в Linux и языке C, я не могу связать C с c++ или java, когда дело доходит до строк !. Я использую Fedora16 - linux - и я хочу прочитать файл proc/[pid]/status, чтобы получить от него определенную информацию, такую как PPID и состояние, затем я должен распечатать эту информацию на экране - командной строки terminal-, Это нужно сделать, написав скрипт ac в gedit. Моя единственная проблема в том, что я новичок в c, и дело со струнами в c кажется очень расстраивающим для меня! Я уже открыл файл и просмотрел его на своем терминале, выполнив файл c. Есть ли какой-либо возможный способ хранения всего содержимого в одной строковой переменной, а затем я могу его подделать и хранить куски данных, как в массиве строк, а не в массиве char, тогда я знаю, где находятся мои нужные данные в массиве, и я могу получить к нему доступ?

Вот мой код, хотя

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

}

Выходной сигнал:

enter image description here

спросил(а) 2015-10-17T11:38:00+03:00 4 года, 1 месяц назад
1
Решение
55

Вначале есть две вещи

line не должна быть const. while (!feof(file)) почти всегда ошибочно.

Исправление включает в себя выполнение чего-то вроде

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

ответил(а) 2015-10-17T11:51:00+03:00 4 года, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема