Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

angelicous

fork, exec e kill

Mensagens Recomendadas

angelicous

Boas pessoal,

Queria saber se alguém me poderia ajudar como controlar uma situação. Eu tenho um programa, que após o utilizador fazer login, dá-lhe acesso a uma shell (basicamente uma cópia do terminal), no qual o utilizador faz o que bem lhe apetecer, mas o meu programa inicial vai sempre monitorizando certos dados relativos a esse seu processo filho, e com base nesses dados decide ou não matar o processo.

Por exemplo, imaginem que o utilizador faz login, abrimos um fork para ele que tem o seu terminal, e faz algo que exige 20% do desempenho do cpu. O meu programa inicial (o pai), que está a monitorizar esse processo filho onde o utilizador está, ao ver essa situação, dá ordem de kill do processo. Até aqui tudo bem.

Mas e se o utilizador, abre um programa que cria mais forks? Como é que eu monitorizo esses processos para saber a taxa de ocupação do cpu, e como é que os "mato" também, se quiser matar o processo do utilizador que os chamou? É que não existe forma de saber se o fork do utilizador criou forks dentro dele, certo?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
angelicous

Mas não tens controlo sobre o programa que o utilizador executa... É do género, ele mete um programa dele numa pen que abre 20 forks, que executam prints infinitos por exemplo... Como é que eu sei, o PID de um filho num programa feito pelo utilizador? É que a partir do momento que ele executa o programa, eu deixo de poder fazer pipes ou o que seja, para enviar a informação para cima... O que eu queria saber, era se um processo, pode saber os PID dos netos basicamente...

Uma forma seria, o processo pai saber o PID dos filhos, e enviar para cima para o "avô". O problema é que no programa do "meio" eu não posso fazer isso. Não é possível, um processo saber quais são os seus filhos pois não?

Editado por angelicous

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
angelicous

Certo Hippo, mas como é que tu fazes isso num processo que não tens qualquer controlo?

Dando um exemplo prático, imagina que tu és o criador do init. Criaste a bash do terminal, que recebe uma string do user, e executa comandos. O user abre o que lhe apetecer certo? Pode abrir um programa chamado XPTO, que faz 20, 30 ou 100 forks que não tem qualquer problema. Isso é algo do user.

Agora imagina, que tu como init, queres que sempre que o processo "user" esta a executar coisas que passem por exemplo dos 20% da taxa de ocupação do cpu, sejam terminados. Ou seja se aquele processo "user", filho do init, estiver a +20% na taxa de CPU, é terminado. Porreiro, sabes o seu PID, porque quando criaste o fork, o guardaste, e basta fazeres o kill. Mas e se o utilizador, no programa XPTO que abriu, criou 20 forks e continuarem abertos? Aqueles 20 processos não só continuam abertos, como nem se contaram para a utilização do CPU que estamos a monitorizar, certo? E eu não sei quais são no init, porque foi um programa do utilizador que os criou... A única coisa que sei no init, é o ID do processo "user"que arrancou para arrancar com a bash.

O meu problema é saber esses ID's associados ao processo "user"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

A única coisa que sei no init, é o ID do processo "user"que arrancou para arrancar com a bash.

não porque como te disse, terás de perguntar ao sistema operativo pelo PPID dos processos e contabilizar os processos por este valor


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
angelicous

Mas isso é o que eu disse... O init pergunta ao sistema operativo o PID do fork que acabou de criar e guarda para futura referência, certo? Mas depois fazes um execvp por exemplo, de algo que não tens controlo, e esse programa cria outros forks, como é que tens os detalhes desses forks? Tu em cima só vais poder encerrar o que conheces...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

epa ... já te disse o que tens de fazer, se continuas a teimar no que pensas ter como uma dado adquirido, mais não posso fazer


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
angelicous

Ok, acho que já percebi o que querias dizer ao certo.

Diz-me só uma coisa sff. Tendo apenas o ID, como é que sei a informação do ppid desse processo sem estar nele?

Se estiver dentro é só fazer getppid(). Mas se estiver dentro do processo 100 e quiser saber qual é o pai do processo 200, como sei? O getppid, tem algum variante?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
angelicous

Dúvida.

Quando no terminal faço, por exemplo "ls > text.txt" ele grava-me todo o output do ficheiro ls, dentro do ficheiro text.txt

É possível fazer isto usando por exemplo um execl? Se sim, como?

Ou a única maneira é usando pipes para desviar o output?

Editado por angelicous

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.