Me aventurando em baixo nível, construindo o MyShell em C
Oi, pessoal! Como estudante de primeiro ano de engenharia da computação, ainda estou me acostumando com a programação de baixo nível, mas recentemente me joguei num projeto que me deixou super animado, construír meu próprio shell em C.

É uma ferramenta de linha de comando leve que executa comandos, lida com redirecionamento de entrada e saída, e até mantém um histórico dos comandos. Vou contar como foi essa jornada, o que aprendi, onde tropecei e por que esse projeto parece uma grande vitória para um iniciante como eu.
Sempre tive curiosidade sobre como os terminais como Bash ou PowerShell realmente funcionam, quando você digita ls ou cat arquivo.txt, há uma toda uma engranagem rodando nos bastidores, processos sendo criados, chamadas de sistema disparando e saídas indo para os lugares certos. Quis dar uma espiada por trás dessa cortina. Além disso, meu professor mencionou que construir um shell é uma boa forma de se familiarizar com programação de sistemas, então pensei, por que não tentar?
Comecei com um objetivo simples, interpretar a entrada do usuário e executar comandos. Parece fácil, né? Nem tanto! Logo descobri que um shell precisa gerenciar várias coisas, analisar strings, criar processos e gerenciar recursos sem vazar memória. O código é modular, com funções para interpretação, execução e gerenciamento de histórico. Tentei manter tudo limpo, cada alocação tem um free correspondente, e os erros são reportados de forma clara, não é perfeito, mas, para um aluno de primeiro ano, estou bem orgulhoso.
Bom, fazer isso funcionar não foi um mar de rosas. No começo, bati de cara com problemas de compilação no Windows, o MinGW "reclamava" de símbolos ausentes como gethostname, descobri que precisava linkar -lws2_32 para suporte ao Winsock. Teve também aquela vez que esqueci de fechar handles de arquivos, o que causou vazamentos de recursos durante os testes. Depurar problemas de threads foi outro desafio! Mas cada correção me ensinou algo novo.
A parte mais complicada foi torná-lo multiplataforma, Windows e Linux têm maneiras diferentes de lidar com processos e entrada, então usei #ifdef _WIN32 para alternar entre eles, as vezes, parecia que estava escrevendo dois programas, mas valeu a pena ver o MyShell rodando tanto no meu laptop quanto nas máquinas Linux da minha VM.
Por outro lado, quis garantir que o MyShell não fosse um desastre de segurança, por isso defini limites de tamanho de entrada (máximo de 1024 bytes) para evitar estouros de buffer e verifiquei cada malloc e strdup em busca de falhas. Operações com arquivos usam permissões seguras (0644 no Linux), e busquei fechar todos os handles, mesmo em casos de erro. Para threads, usei um mutex para proteger a saída do console, mantendo tudo organizado quando vários comandos rodam ao mesmo tempo.
Não é uma fortaleza, mas tentei seguir o conselho dos bons e velhos livros que abordam melhores práticas, segurança (validar entradas, liberar recursos e lidar com erros de forma inteligente).
O Que Aprendi nessa jornada?
Cara, foi como um curso intensivo de programação. Coloquei a mão na massa com criação de processos, E/S de arquivos e threads, que pareciam abstratos na aula, mas fizeram sentido quando vi em ação. A parte multiplataforma me ensinou sobre as diferenças entre sistemas operacionais, o Windows com suas APIs verbosas, enquanto o Linux mantém as coisas enxutas, também aprendi a amar (e odiar) depuração, encontrar um segfault na lista de histórico foi doloroso, mas consertar foi gratificante.
Emfim, esse projeto me mostrou como é recompensador construir algo funcional do zero, há uma certa emoção em digitar ls no seu próprio shell e ver funcionar, não é só código, é uma ferramenta que você pode usar, e isso é bem legal para um estudante de primeiro ano.
P.S. Se você é estudante como eu, não tenha medo de começar com projetos pequenos como esse. É bagunçado, é difícil, mas vale muito a pena quando você vê seu código ganhar vida!
Até mais!