Listando processos via /proc/PID
Publicado por Perfil removido (última atualização em 24/08/2015)
[ Hits: 3.466 ]
Esse script lista os processos via /proc/.
#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;
}
Conversão de Decimal para Binário
Script MakePach para correção de platarforma 32 bits para 64
Nenhum comentário foi encontrado.
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?
Programa fora de escala na tela do pc (36)
Instalação dualboot Windows 11 e Debian 13 (0)
Eu queria adicionar a incon do wifi e deixa transparente no fluxbox no... (0)









