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 http://blog.jorgepereira.com.br/jorge/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]$