Listando processos via /proc/PID

Publicado por Matheus (última atualização em 24/08/2015)

[ Hits: 2.292 ]

Homepage: http://hc0der.blogspot.com

Download pid-info.c




Esse script lista os processos via /proc/.

  



Esconder código-fonte

#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <dirent.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <pwd.h>
#include <assert.h>
#define PROC "/proc/"

/* ************************************ *
 * Get PIDs and cmdline from /proc/ *
 * Ter Fev 10 18:38:31 BRST 2015    *
 * Author: MMxM | hc0der.blogspot.com   *
 * ************************************ */


void *xmalloc(size_t len);
void safefree(void **ptr);
void die(const char *err);
int cmdline_info(const char *cmd);
void status_info(const char *path, size_t len);

void die(const char *err){
    (errno) ? perror(err) : fprintf(stderr,"%s\n",err);
    exit(1);
}

void *xmalloc(size_t len){
    void *ptr = malloc(len);
    if(ptr == NULL)
        die("malloc error");
    return ptr;
}

void xfree(void **ptr){
    assert(ptr);
    if(ptr != NULL){
        free(*ptr);
        *ptr = NULL;
    }
}

int cmdline_info(const char *cmd){
    FILE *fp = NULL;
    char C = 0;
    size_t x = 0;


    if( (fp = fopen(cmd,"r")) == NULL)
        return 0;

    while( (C = fgetc(fp)) != EOF )
        x += printf("%c",C);

    fclose(fp);

    return x;
}

void status_info(const char *path, size_t len){
    char *status_file = NULL, C = 0;
    FILE *fp = NULL;

    status_file = strncpy( xmalloc( (len+6) * sizeof(char) ), path, len);
    strncat(status_file, "status", 6);

    if( (fp = fopen(status_file, "r")) != NULL){
        fseek(fp, 6, SEEK_SET);
        while( (C = fgetc(fp)) != '\n')
            printf("%c",C);

        fclose(fp);
    }

    xfree((void **)&status_file);

}

int main(void){
    DIR *dip;
    struct dirent *dit;
    struct stat owner;
    struct passwd *pd;
    int pid_nb = 0;

    char *file = NULL, *cmdline = NULL;
    size_t alloc_size = 0;

    if( (dip=opendir(PROC)) == NULL )
        die("opendir() error");


    printf("USER\tPID\tCOMMAND\n");

    while ( (dit = readdir(dip) ) != NULL ){
        if(dit->d_type != 4)
            continue;

        pid_nb = (int) strtol(dit->d_name, NULL, 10);

        if(pid_nb == 0)
            continue;

        alloc_size = 6+strlen(dit->d_name)+2;

        file = xmalloc( alloc_size * sizeof(char));
        snprintf(file, alloc_size, "%s%s/",PROC,dit->d_name);

        if(stat(file, &owner) == -1){
            xfree((void **)&file);
            continue;
        }

        if((pd = getpwuid(owner.st_uid)) == NULL){
            xfree((void **)&file);
            continue;
        }

        printf("%s\t",pd->pw_name);
        printf("%s\t",dit->d_name);

        cmdline = strncpy( xmalloc( alloc_size + 7 ) , file , alloc_size );
        strncat(cmdline,"cmdline",7);

        if(!cmdline_info(cmdline)){
            printf("[");
            status_info(file, alloc_size);
            printf("]");
        }

        printf("\n");

        xfree((void **)&cmdline);
        xfree((void **)&file);
    }

    closedir(dip);

    return 0;

}

Scripts recomendados

C/C++

Arvore Binária

Script para trocar o papel de parede do fluxbox em GTK

Usando shared memory 2

Ordenar sequência de números


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts