This repository has been archived on 2021-10-31. You can view files and clone it, but cannot push or open issues or pull requests.
sys_prog/midterm/processes/processes.c

77 lines
1.3 KiB
C
Raw Normal View History

2019-11-08 08:17:52 +00:00
#include <stdio.h>
2019-11-08 08:02:08 +00:00
#include <stdlib.h>
#include "processes.h"
typedef unsigned int uint;
typedef unsigned long int ulong;
const ulong INIT_CAP = 1024;
struct process {
uint pid;
uint ppid;
char user[9];
2019-11-08 08:17:52 +00:00
float priority;
2019-11-08 08:02:08 +00:00
ulong resident_size;
ulong size;
ulong virtual_size;
char command[16];
};
struct processes {
ulong size;
ulong capacity;
2019-11-08 08:17:52 +00:00
struct process* procs;
2019-11-08 08:02:08 +00:00
};
struct processes* new_processes() {
2019-11-08 08:17:52 +00:00
struct processes* p = malloc(sizeof(struct processes));
2019-11-08 08:02:08 +00:00
if (!p) {
return NULL;
}
2019-11-08 08:17:52 +00:00
struct process* p_arr = malloc(INIT_CAP * sizeof(struct process));
if (!p_arr) {
free(p);
return NULL;
}
2019-11-08 08:02:08 +00:00
p->size = 0;
2019-11-08 08:02:52 +00:00
p->capacity = INIT_CAP;
2019-11-08 08:17:52 +00:00
p->procs = p_arr;
2019-11-08 08:02:08 +00:00
return p;
}
2019-11-08 08:02:52 +00:00
void delete(struct processes* p) {
2019-11-08 08:17:52 +00:00
free(p->procs);
2019-11-08 08:02:52 +00:00
free(p);
}
2019-11-08 08:17:52 +00:00
int add_from_file(struct processes* ps, const char* filename) {
FILE* f = fopen(filename, "r");
if (!f) {
return 0;
}
struct process p;
while (fscanf(f, "%u %u %8s %f %lu %lu %lu %15s\n", &p.pid, &p.ppid,
p.user, &p.priority,&p.resident_size, &p.size,
&p.virtual_size, p.command) == 8) {
if (ps->size == ps->capacity) {
ps->capacity *= 2;
struct process* new_procs = realloc(ps->procs,
ps->capacity * sizeof(struct process));
if (!new_procs) {
return 0;
}
ps->procs = new_procs;
}
ps->procs[ps->size] = p;
ps->size++;
}
}
2019-11-08 08:02:08 +00:00