Creio que quase todas as pessoas que utilizam Linux tiveram a necessidade de utilizar algum dos comandos kill, killall, ps, pgrep,… entre tantos outros programas que fazem parte do pacote procps[1].
Justamente a minha necessidade foi diferente, estava precisando em algum momento verificar se um determinado executável estava em execução na lista de processos, foi desta forma que baixei o código fonte do pacote procps e fui da uma olhada para entender sua API que por sinal não existe nenhuma documentação! isto mesmo, existe apenas o pacote procps e o procps-devel que possui os headers utilizado para a acessar os métodos existentes na libproc (geralmente em /lib/libproc.so) conforme abaixo.
[jpereira@jiraya codes]$ ls -1 /usr/include/procps/
alloc.h
devname.h
escape.h
procps.h
pwcache.h
readproc.h
sig.h
slab.h
sysinfo.h
version.h
wchan.h
whattime.h
[jpereira@jiraya codes]$
Desta forma segue um simples código de exemplo utilizado para verificar se o programa especifico passado como parâmetro está em execução.
/** * Autor: Jorge Pereira <jpereiran@gmail.com> * Data: Ter Jan 13 14:29:29 BRST 2009 * Desc: Simples aplicacao utilizada para verificar se existe um * processo em execucao utilizando a procps (libproc) * * Build: gcc -o checkps checkps.c -lproc **/ #include <string.h> #include <stdio.h> #include <stdlib.h> #include <stddef.h> #include <stdbool.h> #include <readproc.h> bool check_process(const char *proc) { int32_t flags = 0; PROCTAB *ptp = NULL; bool st = false; proc_t task; memset(&task, 0, sizeof (task)); if (!proc || strlen(proc) < 1) return false; flags = PROC_FILLCOM | PROC_FILLSTATUS; if ((ptp = openproc (flags)) == NULL) return false; while(!st && readproc(ptp, &task)) { const char *cmd = (task.cmdline != NULL) ? task.cmdline[0] : task.cmd; st = !strncmp(proc, cmd, strlen(proc)); memset (&task, 0, sizeof (task)); } closeproc (ptp); return st; } int main (int argc, char *argv[]) { if (argc < 2) { printf ("Usage: %s <nome do processo>\n", argv[0]); exit(EXIT_SUCCESS); } printf("O Programa (%s) %sesta em execucao\n", argv[1], check_process(argv[1]) ? "" : "nao "); return EXIT_SUCCESS; }
Baixando este código de exemplo, compilando e fazendo uma checagem se existe o processo “dbus-launch” em execução! 🙂
[jpereira@jiraya tmp]$ wget https://blog.jorgepereira.com.br/wp-content/uploads/2009/01/checkps.c
[jpereira@jiraya tmp]$ gcc -o checkps checkps.c -lproc
[jpereira@jiraya tmp]$ ./checkps dbus-launch
O Programa (dbus-launch) está em execução
[jpereira@jiraya tmp]$ ./checkps dbus-lanche
O Programa (dbus-lanche) não está em execução
[jpereira@jiraya tmp]$
/dev/old/comments