Como funciona o computador – Argumentos e comunicação de processos

Para um programa funcionar e trazer respostas diferentes é necessário que haja alguma forma de interagir com o mesmo, as vezes o usuário, outras o próprio sistema. Como os sistemas que utilizamos hoje seguem um padrão que é muito forte na linguagem C, irei usá-la como exemplo.

Todos os programas em C, quando chamados diretamente no sistema, iniciam pela função int main(int argc, char *argv[]), para palavra aqui tem um significado. O primeiro e mais óbvio é o main, que é o nome da função, utilizado pelo sistema para saber o ponto inicial de todo processo. Logo antes temos o retorno da função (int), para os processos também conhecido como “return code”, é utilizado para identificar se o programa finalizou com algum erro ou não. Toda vez que a função main chamar um return para finalizar o processo esse número é enviado para quem iniciou o processo, 0 quando tudo foi processado corretamente (este texto foi copiado sem nenhum tipo de revisão), ou diferente de 0 caso tenha ocorrido algum erro. Isso é feito dessa forma para que possa identificar a causo do erro, um programa que copia arquivos via rede poderia retornar 0 quando copiou corretamente, 1 quando não conseguiu encontrar o arquivo para copiar e 2 quando tiver alguma falha de rede por exemplo, facilitando assim que outros processos saibam o que ocorreu. No Bash ao finalizar a execução de um programa é possível ver o seu “return code” com o comando echo $?.

Para finalizar a assinatura da função main, temos dois argumentos. argc é um contador de quantos argumentos o programa recebeu na inicialização, normalmente isso é utilizando na linha de comando, por exemplo quando executados cp -R arquivo backup no GNU/Linux, passa 3 argumentos diferentes para o processo. Logo em seguida vem o argv, que é uma lista de onde o valor desses argumentos estão dentro da memória, no caso já descrito para que o programa acesso o -R, arquivo e backup podendo identificar o que o mesmo deverá executar. No Bash esses argumentos podem ser passados depois do nome do programa, separados por espaço.

Muitas vezes em alguma interface gráfica abrimos uma foto, ao dar dois cliques, seria como executar um programa na linha de comando, passando o arquivo como argumento, assim o programa sabe qual arquivo ele deve abrir, como gimp foto.jpg.

Os programas que funcionam na linha de comando também são conhecidos por mostrar textos na tela e as vezes pedir para o usuário digite algumas informações. Isso é possível graça a três fluxos de padrões, STDIN, STDOUT e STDERR (este texto foi copiado sem nenhum tipo de revisão), também conhecidos por entrada, saída e saída de erro. Um programa que manipule esses fluxos é capaz de ler o teclado e mostrar mensagens na tela por exemplo. Vale notar que temos dois fluxos de saída, isso permite salvar a saída do programa num arquivo, porém continuar mostrando erros na tela.

No Bash é possível alterar a origem ou destino desses fluxos na execução de códigos. Para que um programa leia um arquivo em vez do teclado, podemos utilizar o <, como em cat < arquivo.txt. Para salvar a saída de um comando num arquivo, podemos utilizar o >, como em find > arquivo.txt, porém caso tenha algum erro ainda será possível ver na tela. Para alterar a saída de erro para um arquivo devemos utilizar o 2>, como find 2> erros.txt. Também podemos juntar esses operadores, como find > arquivo.txt 2> erros.txt. Ainda há uma forma de unir a saída de erro com a saída, utilizando 2>&1, como find > arquivo.txt 2>&1.

Uma das características dos sistemas UNIX são os programas que executam apenas uma função bem definida, fazendo desvios nesses fluxos é possível combinar esses programas para efetuarem coisas maiores, simplesmente conectando a saída de um programa com a entrada de outro, utilizando o |, como cat arquivo.txt | sort | uniq.

Existe ainda uma outra forma de passar argumentos, assim como as linguagens de programação têm variáveis, existem variáveis no contexto do sistema operacional e os processos podem acessá-las, e em alguns casos até alterá-las. No Bash podemos utilizá-las através do export, como export CONFIG=/etc/meu.config e executar o programa posteriormente, ou antes do nome do programa, como CONFIG=/etc/meu.config apache2.

Um exemplo de uso dessas formas de comunicação com processos são os servidores HTTP configurados com CGI, que nada mais são que páginas geradas dinamicamente por um processo. Algumas variáveis referentes ao servidor e cliente são definidas como variáveis de ambiente, formulários e arquivos são enviados para a entrada padrão, o endereço da página acessada inicia um programa específico que processas essas informações e envia para a saída padrão a página HTML que o servidor HTTP responderá para o cliente.

—–

Finalizo aqui esta série, para quem acompanhou espero que tenham gostado.

Não sei se o texto ficou claro o suficiente em todas as partes. O objetivo era apresentar o básico sobre como funciona um computador e como essas partes interagem, podendo assim ter uma visão geral e possibilitar que quem tiver vontade de conhecer mais a fundo possa buscar mais informações. Acredito que esse objetivo tenha sido completado.

Caso surjam mais temas, posso fazer uma segunda série de posts, ou explicar melhor algum ponto, então podem sugerir assuntos.

Anúncios

Comente

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s