implement proc status parsing
This commit is contained in:
parent
bf3a0ece78
commit
e0640a7878
3 changed files with 95 additions and 0 deletions
|
|
@ -1,4 +1,33 @@
|
|||
#ifndef __PROCESS_H
|
||||
#define __PROCESS_H
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
typedef enum {
|
||||
UNINTERRUPTABLE_SLEEP = 'D',
|
||||
IDLE_KERNEL_THREAD = 'I',
|
||||
RUNNING = 'R',
|
||||
INTERRUPTIBLE_SLEEP = 'S',
|
||||
STOPPED = 'T',
|
||||
STOPPED_BY_DEBUGGER = 't',
|
||||
DEAD = 'X',
|
||||
ZOMBIE = 'Z'
|
||||
} process_state_t;
|
||||
|
||||
#define MAX_PROCESS_NAME 256
|
||||
typedef struct {
|
||||
char name[MAX_PROCESS_NAME];
|
||||
mode_t umask;
|
||||
process_state_t state;
|
||||
pid_t tgid;
|
||||
pid_t ngid;
|
||||
pid_t pid;
|
||||
pid_t ppid;
|
||||
pid_t tracer_pid;
|
||||
uid_t uid;
|
||||
gid_t gid;
|
||||
} process_status_t;
|
||||
|
||||
int process_parse_status(pid_t pid, process_status_t* status);
|
||||
|
||||
#endif
|
||||
13
src/main.c
13
src/main.c
|
|
@ -3,6 +3,19 @@
|
|||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
process_status_t status = {};
|
||||
process_parse_status(getpid(), &status);
|
||||
|
||||
printf("name: %s\n", status.name);
|
||||
printf("umask: %d\n", status.umask);
|
||||
printf("state: %d\n", status.state);
|
||||
printf("tgid: %d\n", status.tgid);
|
||||
printf("ngid: %d\n", status.ngid);
|
||||
printf("pid: %d\n", status.pid);
|
||||
printf("ppid: %d\n", status.ppid);
|
||||
printf("tracer_pid: %d\n", status.tracer_pid);
|
||||
printf("uid: %d\n", status.uid);
|
||||
printf("gid: %d\n", status.gid);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1 +1,54 @@
|
|||
#include "process.h"
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
int process_parse_status(pid_t pid, process_status_t* status)
|
||||
{
|
||||
char statusPath[256] = {0};
|
||||
snprintf(statusPath, sizeof(statusPath), "/proc/%d/status", pid);
|
||||
|
||||
int statusFd = open(statusPath, O_RDONLY);
|
||||
if (statusFd < 0) return 1;
|
||||
|
||||
char buffer[4096] = {0};
|
||||
int rd = read(statusFd, buffer, sizeof(buffer));
|
||||
close(statusFd);
|
||||
|
||||
if (rd < 1) return 1;
|
||||
|
||||
char* lineptr = NULL, *line = strtok_r(buffer, "\n", &lineptr);
|
||||
while (line != NULL)
|
||||
{
|
||||
char* fieldptr = NULL;
|
||||
const char* key = (const char*)strtok_r(line, ":\t", &fieldptr);
|
||||
const char* value = (const char*)strtok_r(NULL, ":\t", &fieldptr);
|
||||
|
||||
if (!strcmp(key, "Name"))
|
||||
strncpy(status->name, value, MAX_PROCESS_NAME);
|
||||
else if (!strcmp(key, "Umask"))
|
||||
status->umask = (unsigned int)strtoul(value, NULL, 8);
|
||||
else if (!strcmp(key, "State"))
|
||||
status->state = (process_state_t)value[0];
|
||||
else if (!strcmp(key, "Tgid"))
|
||||
status->tgid = atoi(value);
|
||||
else if (!strcmp(key, "Ngid"))
|
||||
status->ngid = atoi(value);
|
||||
else if (!strcmp(key, "Pid"))
|
||||
status->pid = atoi(value);
|
||||
else if (!strcmp(key, "PPid"))
|
||||
status->ppid = atoi(value);
|
||||
else if (!strcmp(key, "TracerPid"))
|
||||
status->tracer_pid = atoi(value);
|
||||
else if (!strcmp(key, "Uid"))
|
||||
status->uid = atoi(value);
|
||||
else if (!strcmp(key, "Gid"))
|
||||
status->gid = atoi(value);
|
||||
|
||||
line = strtok_r(NULL, "\n", &lineptr);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue