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 pra pôr pra trabalhar. Filha da Égua. Mais ou menos é assim quando você vem falar aqui em processo os filhos em ser mais mais ínox, você vai pôr os bichinhos pra trabalhar. Bom, legal. Para isso, você vai usar uma função do sistema chamado forc. Você vai abrir um forc e seria como se fosse um ramo igual a você mesmo, muito ligado a você. Como todo filho é ligado ao pai, muito ligado ao pai, né? Seus erro eram do caramba. Vamos lá. Bom, vamos lá. Eu tomei puto com o véi, cara, com certeza, cara. Ele me explorou durante uma década e meia. Vai ver e fia da Égua. Então, vamos lá, o processo ele copia uma cópia no próprio pai e o coloca como um filho. Naturalmente, ele é encarado pelo esqueda, ele como um outro processo. Então, o processo pai e o processo filho 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. 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. Então, vamos ver um exemplo aqui. Eu estou criando uma variável global compartilhada entre ambos, processo pai e processo filho. E aqui eu estou vendo que string identidade e uma variável dentro da função. Legal? Bem, beleza? O que acontece? Aqui eu vou abrir um processo filho. Beleza? Quando eu faço o fork, ele me abre um processo filho, que é uma cópia de mim mesmo. Ah, pera aí. Estou mandando mensagem aqui para os caras. Legal, mandei mensagem para os caras aqui. Então, se o processo está retornando, beleza? Se pide, se pide 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. É a diferença de ambas as variáveis. Caso contrário, caso o pay de seja menor que zero, então deu merda. Caso contrário, a identidade é o processo pai. E 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 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 o processo filho quando você quer que realmente rode um código muito semelhante. Muito semelhante mesmo ao que já está rodando. Geralmente o vírus é assim, o orme geralmente é assim. Tá? Bom, vamos lá. E é comum às vezes eu precisar de... Peraí, peraí, peraí, espera aí filho. Espera, aguarde um pouquinho. Então eu posso precisar de utilizar um weight para fazer com que um espere o outro. Porque eu vou te falar, não é comum eles terminar exatamente no mesmo momento. Beleza? Aqui eu tenho fork sendo criado, o pai com um weight. Então o filho ele executa, dá um exit e volta para o pai. Então os dois saem aqui no resumo. Legal? É para isso que usa o weight. Então simplesmente abre o processo pai, o processo filho e é esperado que o pai espera o filho. Lembre-se, aqui é o processo filho. Aqui é o processo pai. Beleza? E aqui é ambos, os dois. Arrodar em ambos. Então está aqui, né? Então você consegue controlar assim. Esperando com o weight. E aí você tem um weight, de um status, você consegue fornecer um sinal para ele, POSIX. E isso é interessante para caramba. Principalmente o SIG. Muito bom. 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 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, sinais que são enviados entre processos. 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, o sinal que foi dado de um processo para o outro. Isso vai muito com relação àquele capítulo de sistemas operacionais modernos. Capítulo, deixa eu ver se eu lembro, multiprocessamento. Quando múltiplos processos estão trabalhando em grupo, está no livro do Turnbull. Ele... Ou todos recebem o sinal ou nenhum recebe o sinal. Então quando você emite um sinal para um grupo de processos, então você consegue capturar os eventos e os sinais deles. Padrão POSIX. Aqui é um outro exemplo. Aqui ele está criando cinco processos filho. Então ele está criando cinco processos filho aqui, deixa os cinco sendo criados e joga ele dentro de um ar-weight de processos filho. E depois você faz aqui um arço de repetição e aguarda o weight pit. O weight, o pedido, sempre pera os processos sem-finalizados aqui. Todos sinalizam, 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ê, com um fork. Você pode 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 Elsie, 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 Poppin e o Exec. System executa um comando FIEL. Cara, é muito comum isso aqui, várias linguagens. E naturalmente nós temos um Exec e você também tem muito semelhante, você tem o weight também para esperar. 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 entre os, 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 caracter, pipes e sockets. Então isso aqui na verdade é um pipe. Vamos ter 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? Você vê que não está trabalhando com strings. Então você vem aqui e você abre com o pop em, 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 target. Então você executa algo, preste atenção, executa algo dentro do if e verifica se deu erro. Pera, se deu erro C para número negativo. C para número negativo. E aqui então você pega as linhas do arquivo e esse arquivo é o fpip, tá vendo? Ele vai pegando as linhas e vai imprimido na tela. É assim que você consegue pegar o output em C, jogar uma variável e depois você percorrer ela usando o i. Depois você finaliza esse arquivo do tipo pipe, tá? É a mesma coisa as bank, entre outras coisas, tá? Nós vamos ver bastante disso lá quando estivermos trabalhando com Python. Python não brincar bastante. É raro a galera de infraestrutura trabalhar com C, C++. Nós só abrimos o C++ se for para dar alguma manutenção e alguma biblioteca e nós imploramos que essa desgraça não aconteça em nossas vidas. Essa é a verdade. No próximo vídeo vamos falar de POSITs. Tchau.