Я пытаюсь построить регистратор процессов в C на Linux, но проблема с его исправлением. Я бы хотел, чтобы у него было 3 колонки: USER, PID, COMMAND. Я использую вывод ps aux
и пытаюсь динамически присоединить его к массиву. То есть для каждой строки ps aux
выходов я хочу добавить строку в свой массив.Почему значения в моем динамическом массиве 2D-символов перезаписываются?
Это мой код. (Для того, чтобы сохранить выход Короче говоря, я Grep только возвышенным. Но это может быть что угодно.)
#define _BSD_SOURCE
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char** processes = NULL;
char* substr = NULL;
int n_spaces = 0;
int columns = 1;
char line[1024];
FILE *p;
p = popen("ps -eo user,pid,command --sort %cpu | grep sublime", "r");
if(!p)
{
fprintf(stderr, "Error");
exit(1);
}
while(fgets(line, sizeof(line) - 1, p))
{
puts(line);
substr = strtok(line, " ");
while(substr != NULL)
{
processes = realloc(processes, sizeof(char*) * ++n_spaces);
if(processes == NULL)
exit(-1);
processes[n_spaces - 1] = substr;
// first column user, second PID, third all the rest
if(columns < 2)//if user and PID are already in array, don't split anymore
{
substr = strtok(NULL, " ");
columns++;
}
else
{
substr = strtok(NULL, "");
}
}
columns = 1;
}
pclose(p);
for(int i = 0; i < (n_spaces); i++)
printf("processes[%d] = %s\n", i, processes[i]);
free(processes);
return 0;
}
Выход для цикла в конце выглядит следующим образом.
processes[0] = user
processes[1] = 7194
processes[2] = /opt/sublime_text/plugin_host 27184
processes[3] = user
processes[4] = 7194
processes[5] = /opt/sublime_text/plugin_host 27184
processes[6] = user
processes[7] = 27194
processes[8] = /opt/sublime_text/plugin_host 27184
processes[9] = user
processes[10] = 27194
processes[11] = /opt/sublime_text/plugin_host 27184
Но из puts(line)
я получаю, что массив должен содержать фактически это:
user 5016 sh -c ps -eo user,pid,command --sort %cpu | grep sublime
user 5018 grep sublime
user 27184 /opt/sublime_text/sublime_text
user 27194 /opt/sublime_text/plugin_host 27184
Таким образом, по-видимому, все значения перезаписи, и я не могу понять, почему ... (Кроме того, я не понимаю, откуда взялось значение 7194
в processes[0] = 7194
и processes[4] = 7194
).
Что я здесь делаю неправильно? Как-то можно сделать вывод похожим на результат puts(line)
?
Любая помощь будет оценена!
Здесь нет двухмерного массива. У вас есть 1D массив указателей. Для каждого указателя выделите кусок памяти и скопируйте туда строку чтения. – Lundin