Jump to content

fork, exec e kill


angelicous
 Share

Recommended Posts

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?

Link to comment
Share on other sites

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?

Edited by angelicous
Link to comment
Share on other sites

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"

Link to comment
Share on other sites

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...

Link to comment
Share on other sites

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?

Link to comment
Share on other sites

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?

Edited by angelicous
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.