Introspection of a process (C programming)

Process introspection, mainly for debugging purpose.

Code

/* Introspection of a process */
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <stdlib.h>

#define MAX_CMDLINE_LEN 1024
#define MAX_CMDLINE_FILE_NAME 32

void display(pid_t pid) {
    char cmdline[MAX_CMDLINE_LEN] = {0};
    char cmdline_fname[MAX_CMDLINE_FILE_NAME] = {0};
    sprintf(cmdline_fname, "/proc/%d/cmdline", (int)pid);
    int cmdline_fd = open(cmdline_fname, O_RDONLY);
    if (cmdline_fd < 0) {
        fprintf(stderr, "Failed to open %s - %s\n",
            cmdline_fname, strerror(errno));
        exit(1);
    } else {
        read(cmdline_fd, cmdline, MAX_CMDLINE_FILE_NAME-1);
        printf("%d - %s\n", (int)pid, cmdline);
    }
}

void introspect() {
    /* examine process identifier */
    pid_t pid = getpid();
    pid_t ppid = getppid();
    pid_t pgid = getpgrp();
    pid_t sid = getsid(0);

    printf("pid: ");
    display(pid);
    printf("pgid: ");
    display(pgid);
    printf("ppid: ");
    display(ppid);
    printf("sid: ");
    display(sid);

    /* examine the prcess's user and group identifier */
    uid_t uid, euid, suid;
    gid_t gid, egid, sgid;
    getresuid(&uid, &euid, &suid);
    getresgid(&gid, &egid, &sgid);
    printf("uid=%d, euid=%d, suid=%d\n", (int)uid, (int)euid, (int)suid);
    printf("gid=%d, egid=%d, sgid=%d\n", (int)gid, (int)egid, (int)sgid);
}

int main() {
    introspect();
    return 0;
}

Demo Result

pid: 26748 - ./introspect
pgid: 26748 - ./introspect
ppid: 26178 - /bin/bash
sid: 26178 - /bin/bash
uid=1000, euid=1000, suid=1000
gid=1000, egid=1000, sgid=1000

你可能感兴趣的:(c,linux,process,introspection)