<aside> 🕳️ Um pequeno guia com o intuito de organizar o conhecimento necessário para entregar o projeto Pipex da escola 42 de maneira otimizada. Vc quer diagrama? Aqui tem. Curadoria de vídeos e artigos? Tem também. Listinha de tarefas pra construir o projeto passo a passo? Também. Vem que tem!!!
</aside>
palavras-chave: processos Unix, fork, exec, redirecionamento, dup, heredoc
Eu levei exatamente 1 mês para entregar esse projeto. Em que pese que teve a pausa de fim de ano no meio do caminho, e que viajei pros meus pais pra passar as festividades junto, ainda assim todo dia eu procurei estudar ou fazer alguma coisa do projeto. Esse é um projeto sobre processos Unix em C, e aprendemos basicamente a rodar processos paralelamente para executar vários comandos de uma vez só, e também como fazer os vários processos se comunicarem entre si.
A primeira coisa que fiz foi ler sobre as funções permitidas no PDF uma a uma. Isso me ajudou a ter uma vaga ideia do que precisava fazer, mas senti que eu precisava de exemplos mais práticos. Daí me passaram uma playlist de um jovem explicando vários conceitos de processos Unix e as funções que precisamos usar no projeto, uma playlist realmente completa. Porém, pode ser só eu, mas eu fiquei com a impressão de que ver esses vídeos na ordem da playlist foi um pouco ineficiente, por exemplo, o primeiro vídeo da playlist explica o que é um fork
, sendo que eu acredito que começar estudando o pipex pelo fork
gera mais dúvidas que respostas hehehe.
Por isso, quis escrever esse mini guia para entender o pipex, porque acredito que existe uma maneira mais eficiente de aprender, que é: com um pontapé inicial (como executar um comando bash em C) e que vai se desdobrando em problemas complementares (como por exemplo o fato de que um exec
imediatamente encerra o processo/a main, ou como receber esses comandos da lista de argumentos da main, e não em hardcode) que, por sua vez, ao serem resolvidos, geram outras dúvidas e problemas, até que o projeto como um todo tome forma e faça sentido, um passo de cada vez.
Espero que esse método aqui proposto te ajude a ganhar tempo nos estudos e a entender com mais facilidade e menos frustração o projeto!
Boa sorte 🍀
<aside> 👽 Rods do futuro falando! No fim das contas, valeu muito a pena ter feito o pipex porque, exceto pela forma como os comandos são recebidos dentro do programa, ele é exatamente o que precisamos implementar no Minishell!! Com certeza o esforço pra fazer esse projeto se paga mais na frente no Minishell, então fica essa dica ;)
</aside>
O objetivo do pipex é reproduzir o comportamento do operador |
(pipe) da shell, utilizando bibliotecas de C. Por debaixo do capô, quando vc roda um comando do tipo < batata.txt ls -l | wc -l > frita.txt
no terminal, é mais ou menos isso aqui acontece:
batata.txt
é aberto para que o bash consiga ler o que está lá dentroinput
é redirecionado para a entrada do primeiro comando ls -l
.
[por padrão, a entrada de um comando bash é o Standard Input (STDIN, file descriptor = 0), então para que o comando rode em cima do conteúdo de um arquivo específico, precisa haver esse redirecionamento do input para o STDIN do primeiro comando]ls -l
é redirecionada para a entrada do segundo comando wc -l
ao invés de ser printada no terminal.
[por padrão, a saída de um comando bash é o Standard Output (STDOUT, file descriptor = 1), que é o terminal. Então para que o segundo comando rode em cima da saída do primeiro comando, precisa haver um redirecionamento do STDOUT de um para o STDIN de outro]wc -l
é redirecionada para o arquivo frita.txt
ao invés de ser printada no terminal.Talvez “ser redirecionado” esteja um pouco vago. Então pensa que redirecionar o output de um comando para o input de outro é mais ou menos como aquelas caixinhas que tem na porta de banco onde vc precisa colocar seus objetos eletrônicos/metálicos pra poder passar na catraca. A diferença é que no banco, é você quem coloca e tira os objetos da caixa. No caso do pipex, o comando 1 coloca na caixa (escreve) o seu output, e o comando 2 retira da caixa (lê) o conteúdo, e o usa como for preciso. O pipe é a caixa dentro da qual os conteúdos são guardados temporariamente.
As funções que o PDF lista são responsáveis por fazer um pedacinho desse fluxo. Não vou entrar em detalhe porque vale a pena cada pessoa fazer suas pesquisas, mas eu vou deixar esse diagrama que fiz pra entender o fluxo: