Listando processos via /proc/PID
Publicado por Perfil removido (última atualização em 24/08/2015)
[ Hits: 3.522 ]
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;
}
Emulador de Chip8 (com gráficos)
Thread, Courses, Shell e Aquivo
Mudando Cor da Letra e Fundo de Tela
Fila bancária utilizando lista simplisment encadeada
Rotina para controle de portas paralelas em C. (biblioteca LP.h)
Nenhum comentário foi encontrado.
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Script de montagem de chroot automatica
Atualizar Linux Mint 22.2 para 22.3 beta
Jogar games da Battle.net no Linux com Faugus Launcher
Como fazer a Instalação de aplicativos para acesso remoto ao Linux
Assisti Avatar 3: Fogo e Cinzas (4)
Conky, alerta de temperatura alta (11)









