DEV Community

Márcio Scotuzzi Júnior
Márcio Scotuzzi Júnior

Posted on

Recriando o comando cat do Linux em C

No dia a dia, nós usuários de Linux costumamos utilizar uma série de programas simples, porém extremamente úteis. Um que eu utilizo com frequência é o cat - que nos permite exibir no terminal o conteúdo de um arquivo. Porém, você já parou para pensar em como esse programinha funciona?

Suponhamos que eu queira conferir o conteúdo do arquivo toc_toc.txt:

Image description

Ao chamar o comando cat eu forneço como argumento o arquivo que eu quero exibir e, como resposta, no terminal é exibido o que o tal arquivo contem. Portanto, se quisermos recriar esse comando, o primeiro passo será receber um argumento por linha de comando.

Image description

Na linha 5 nós estamos definindo dois parâmetros para a função main:

  • argc: conta quantos argumentos foram passados pela linha de comando na hora que o programa foi executado;
  • argv: é um vetor com todos os argumentos passados

Note que todo programa terá, no mínimo, um argumento - o nome do programa. Por isso checamos se o argc é menor do que 2, pois caso seja isso é um sinal de que o nome do arquivo que o cat deverá exibir o conteúdo não foi fornecido. Nesse caso, exibimos uma mensagem informando a maneira correta de utilizar o programa e encerramos a execução com um código de erro.

Se o programa recebeu os devidos argumentos quando foi executado, o próximo passo é abrirmos o arquivo cujo o nome foi informado.

Image description

Fazemos isso declarando um ponteiro para um arquivo e abrindo ele em seguida.

Na linha 15 nós checamos se tudo ocorreu de forma adequada na abertura do arquivo. Caso algum problema tenha ocorrido, exibimos uma mensagem de erro e encerramos a exceução do programa.

Por fim, temos um loop que irá ler caracter por caracter do nosso arquivo até chegar ao final - exibindo esses caracteres no terminal.

Image description

Após finalizarmos a leitura e exibição do conteúdo do arquivo, nós fechamos o arquivo e encerramos o programa.

Agora é só compilar e testar.

Image description

Funciona!!!

Uma coisa importante a dizer é que a implementação do cat original é bem mais complexa (código fonte aqui) e tem 800 linhas. Porém, a ideia dessa implementação que fizemos é apenas entender como certos programas que utilizamos no dia a dia funcionam na sua forma mais básica. Aliás, apesar da nossa implementação ser muito mais simples que a original, se compararmos as saídas do nosso programa e do cat do Linux, vamos ver que ambos produzem a mesma saída.

Image description

Tentar recriar esses utilitários de sistema operacional é uma ótima forma de dar os primeiros passos no desenvolvimento baixo nível e aprofundar os conhecimentos em linguagens como C. Por falar em baixo nível, como seria implementar o cat em Assembly? Eu vou fazer os meus testes e volto para te contar.

Fique bem até lá :)

Top comments (2)

Collapse
 
joao9aulo profile image
João Paulo Martins Silva

Muito legal, seria interessante uma série de posts reproduzindo comandos clássicos do Linux

Collapse
 
scotuzzijr profile image
Márcio Scotuzzi Júnior

Oi, João! Tudo bem? Obrigado pelo comentário :) Achei a sua ideia bem legal e vou separar alguns outros comandos para mostrar por aqui. Abraço!