Transcrição do áudio
É colega, agora nós vamos falar sobre o que? Processo ilho. Bom, vamos lá. É natural que um processo, ele precise de uma forcinha. Bom, vamos fazer como meu pai fez. Meu pai teve vários filhos do sexo masculino para trabalhar, filha da égua. Mais ou menos é assim quando você vem falar aqui em processos filhos em C++ e Linux. Você vai pôr os bichinhos para trabalhar. Bom, legal. Para isso, você vai usar uma função do sistema chamado fork. Você vai abrir um fork que seria como se fosse um ramo igual a você mesmo, muito ligado a você. Como todo filho é. Ligado ao pai, muito ligado ao pai. Seu Zé Ruela do caramba. Vamos lá. Bom, vamos lá. Eu estou meio puto com o véio, com certeza. O véio me explorou durante uma década e meia. O véio fez da égua. Então vamos lá. O processo, ele copia uma cópia do próprio pai e o coloca como um filho. Naturalmente, ele é encarado pelo schedule como um outro processo. Então o processo pai. O processo filhos são dois processos diferentes, mas que compartilham o mesmo código. Beleza? E naturalmente, você pode naturalmente tratar algumas variáveis em comum entre eles. E isso é interessante. Bom, nós temos duas abordagens, thread e processos filho. A thread, ela é aberta quando você precisa que algum trabalho seja feito em segundo plano. O processo filho. Você utiliza quando. O que vai rodar é simplesmente o mesmo código que o seu. Então você abre um filho. Essa é a particularidade entre ambas. Legal? Então vamos ver um exemplo aqui. Estou criando uma variável global compartilhada entre ambos. Tá? Processo pai e processo filho. E aqui eu estou vendo string identidade. E uma variável dentro da função. Legal? Função main. Beleza? O que acontece? Aqui eu vou abrir um processo filho. Beleza? Quando eu faço um fork, ele me abre um processo filho, que é uma cópia de mim mesmo. Tá? Pera aí. Estou mandando mensagem para os caras. Legal, mandei mensagem para os caras aqui. Então se o processo está retornando, beleza? Beleza? Beleza? Beleza? Se pede, se pede, foi igual a zero, bom. Então a identidade é do processo filho. Eu aumento a variável global. Global é vista pelo pai e pelo filho. E a variável de função só é vista, naturalmente, a da função do filho, pelo filho. A da função do pai, pelo pai. Tá? É a diferença de ambas as variáveis. Caso contrário, caso o payD seja menor que zero, então deu merda. Caso contrário... Caso contrário, a identidade é o processo pai. Se você rodar isso, você vai ver que aqui dentro é onde você coloca toda a particularidade do processo filho. Aqui é onde você coloca toda a particularidade do processo pai. Ou seja, tudo que é só para rodar no filho, aqui. Tudo que é para rodar só no pai, aqui. E tudo aquilo que é para rodar nos dois, aqui. Então veja que é um código um pouco complicado. O que é para rodar no filho? O que é para rodar no filho? O que é para rodar no filho somente? O que é para rodar no pai somente? E o que é para rodar em ambos? E é aquele negócio que eu falei para vocês. Você só usa processo filho quando você quer que realmente rode um código muito semelhante. Muito semelhante mesmo ao que já está rodando. Geralmente um vírus é assim. Um worm geralmente é assim. Vamos lá. E é comum, às vezes, eu precisar de... Espera aí, espera aí, espera aí filho. Espera, aguarde um pouquinho. Então eu posso precisar de utilizar um wait. Para fazer com que um espere o outro. Porque, eu vou te falar, não é comum eles terminarem exatamente no mesmo momento. Beleza? Aqui eu tenho fork sendo criado. O pai com um wait. Então o filho ele executa, dá um exit e volta para o outro. Então o filho ele executa, dá um exit e volta para o outro. Então o filho ele executa, dá um exit e volta para o outro. Então o filho ele executa, dá um exit e volta para o outro. Então os dois saem aqui no resumo. É para isso que usa o wait. É para isso que usa o wait. Então simplesmente abre o processo pai, processo filho. E é esperado aqui, o pai espera o filho. E é esperado aqui, o pai espera o filho. E é esperado aqui, o pai espera o filho. Lembre-se, aqui é o processo filho. Lembre-se, aqui é o processo filho. Aqui é o processo pai. E aqui é ambos, os dois. Para rodar em ambos. Então está aqui. Então você consegue controlar assim. Então você consegue controlar assim. Esperando com o wait. E aí você tem o wait de um status. E aí você tem o wait de um status. Você consegue fornecer um sinal para ele. Você consegue fornecer um sinal para ele. Isso aqui é interessante para caramba. Isso aqui é interessante para caramba. Principalmente o sig. Muito bom. Aqui nós estamos falando que abrir. Aqui nós estamos falando que abrir. Aqui um processo filho. Está guardando as variáveis. Aqui ele está esperando um tipo de saída. Aqui ele está esperando um tipo de saída. E aí ele pega o sinal da saída. O que é o sinal da saída? O sinal POSIX. Então nós temos lá vários, como eu posso dizer, Então nós temos lá vários, como eu posso dizer, Sinais que são enviados entre processos. Esses sinais são números que vamos ver Esses sinais são números que vamos ver Aqui no tópico de POSIX, que é a próxima aula. E nós podemos capturar Qual foi o número ou sinal Qual foi o número ou sinal Isso vai muito Com relação àquele capítulo De sistemas operacionais De sistemas operacionais modernos Deixa eu ver se eu lembro, Multiprocessamento Quando múltiplos processos Estão trabalhando em grupo Está no livro do Tarnow Ou todos recebem o sinal Ou todos recebem o sinal Ou todos recebem o sinal Então quando você emite um sinal para um grupo de processos Então você consegue capturar os eventos Então você consegue capturar os eventos aqui é um outro exemplo aqui ele está criando 5 processos filho então ele está criando 5 processos filho aqui deixa os 5 sendo criados e joga ele dentro de um Array de processos filho e depois você faz aqui um laço de repetição e aguarda o wait o wait o o PID dele você espera os processos serem finalizados aqui todos finalizam, todos saem é uma forma de você trabalhar com múltiplos processos legal bom, você pode também abrir processos filho mas não sendo exatamente como você, como fork você pode tipo fazer com que um processo abra outro processo que na verdade é um outro binário mas aí você não tem esse lance aqui do do ELSI, do IF do que é o processo pai, do que é o processo filho então vamos lá olha só você tem um cara chamado system o popin e o exec system executa um comando gel é muito comum isso aqui em várias linguagens e naturalmente nós temos um exec e você também tem muito semelhante você tem o wait também para esperar tá, system e você está executando um comando pegando o output e escrevendo na saída em Python nós vamos trabalhar bastante com isso já a chamada do pop ele abre um processo e cria um pipe de comunicação através de um tipo de arquivo nós vimos no capítulo de sistemas de arquivos que nós temos alguns arquivos especiais especial de bloco especial de carácter especial de arquivo especial de carácter especial de carácter especial de carácter pipes e sockets pipes e sockets pipes e sockets então isso aqui na verdade é um pipe então isso aqui na verdade é um pipe tá vamos criar um arquivo vamos chamar de pipe e aí nós vamos criar aqui um comando tipo C linguagem C você cria um char e você cria aqui tipo um array de char, certo? e aí você cria aqui o retorno de 256 caracteres isso aqui é C, tá galera? isso aqui é C, tá galera? Você vê que não está trabalhando com strings. Então você vem aqui e você abre com o popem. Se deu certo, ele não vai executar isso aqui. Se deu errado, ele vai executar isso aqui. Legal? Então se deu certo, ele vai pular. Vai executar e vai pular isso aqui. É muito comum isso no mundo Linux. E principalmente no C. Você não tem trycat. Então você executa algo. Preste atenção. Executa algo dentro do if e verifica se deu erro. Sério. Se deu erro, sempre é número negativo. Sempre é número negativo. E aqui então você pega as linhas do arquivo. E esse arquivo é o fpip. Está vendo? Ele vai pegando as linhas e vai imprimindo na tela. É assim que você consegue pegar o output em C. Jogar em uma variável. E depois você percorrer ela usando o I. Depois você finaliza esse arquivo do tipo pipe. Então a mesma coisa é ZEC, entre outras coisas. Nós vamos ver bastante isso lá quando estivermos trabalhando com Python. Python, vamos brincar bastante. É raro a galera de infraestrutura trabalhar com C, C++. Nós só abrimos o C, C++ se for para dar alguma manutenção em alguma biblioteca. E nós imploramos. E nós imploramos que essa desgraça não aconteça em nossas vidas. Essa é a verdade. Próximo vídeo, vamos falar de POSITES. Até mais. Tchau.