Neste artigo, vamos explicar o que é a famosa instrução system(“pause”) e por que você não deve utilizá-la.
Imagine que você esteja iniciando um curso de Ciência da Computação (ou seguindo algum tutorial no YouTube) e lhe seja passada a tarefa de escrever um programa em C que receba dois números do teclado e exiba sua soma. Você, então, escreve o seguinte código: (pelo amor à simplicidade, vamos supor que você não aprendeu, ainda, a fazer a validação das entradas)
#include <stdio.h> int main() { int a, b; printf("Digite o primeiro numero: "); scanf("%d", &a); printf("Digite o segundo numero: "); scanf("%d", &b); printf("A soma e: %d", a + b); return 0; }
Ao compilar o código, sua IDE abre uma janela. Você digita o primeiro número, aperta enter; digita o segundo, aperta enter. Nesse momento, a janela some e você, sem entender nada, fica preocupado, pensando no que pode ter feito de errado.
Desesperado, você abre o Google em busca de soluções, até que uma alma caridosa em algum fórum lhe dá a solução mágica: inclua a linha system(“pause”); antes de return 0;. Você faz isso e… voilá! Seu programa está funcionando como deveria. Você fica feliz e entrega a atividade, sem, no entanto, entender direito o que aconteceu.9
Por que não consigo ver a saída do meu programa?
Para entender o que aconteceu, em primeiro lugar, é preciso entender como um programa de linha de comandos funciona. Para isso, vamos voltar uns 40 anos no tempo e ver como era a execução de um programa no ambiente MS-DOS:
- O usuário digita o nome do programa no prompt de comando;
- O sistema executa o programa;
- O programa termina e o sistema retorna ao prompt de comando.
Hoje, no entanto, a maioria dos sistemas operacionais utiliza interface gráfica e o que era para ser algo no prompt de comando é executado em uma janela. Como os computadores atuais são muito rápidos, geralmente a janela é fechada antes de que o programador possa verificar o resultado de seu software.
O que system(“pause”); realmente faz?
Para entendermos o que essa função faz, é necessário explicar que, nessa linha, existem duas instruções diferentes. O comando system(); executa um comando do sistema operacional; Já o pause, por sua vez, é uma instrução dos sistemas DOS/Windows que interrompe a execução de um arquivo de lotes. Preste atenção ao fato de que pause não é um programa mas, sim, uma instrução que já está embutida dentro do interpretador cmd ou command.com.
Por que usar system(“pause”); é errado?
A utilização de system(“pause”), que além de ser muito comum em fóruns e com programadores iniciantes, também é indicada por alguns professores universitários, é considerada uma prática ruim, pois fere vários fatores, que vão desde a portabilidade até a segurança.
system(“pause”); não é portável
Para começar, lembre-se de que system(); executa uma instrução do sistema operacional. Se você usa um sistema baseado em Windows, certamente não verá maiores problemas em utilizar essa instrução. No entanto, o que aconteceria se seu instrutor, professor, ou outra pessoa, compilasse esse seu programa em um ambiente Linux, BSD ou Mac OS?
Nesses ambientes, a instrução pause simplesmente não existe. Logo, apesar de o seu programa ser compilado sem problemas, quando seu programa chegar nessa instrução, o interpretador exibirá uma mensagem de erro e, além de não resolver o problema de visualização do resultado em uma janela, a saída poderá ficar pior.
system(“pause”); complica a execução
No exemplo acima, tudo que estávamos fazendo era invocar instruções padrão da linguagem C para obter e somar dois números. Ao utilizarmos essa instrução, forçamos o programa a descer ao nível do sistema operacional para executar uma instrução desnecessária.
system(“pause”); representa um risco à segurança
Apesar de parecer uma solução simples, a mera inserção dessa instrução torna seu programa inseguro por padrão. Lembra quando foi dito que não existe um programa chamado pause e que essa é uma instrução interna do interpretador de comandos do DOS/Windows? Pois então, imagine o que aconteceria se algum usuário malicioso colocasse um programa chamado pause.exe em alguma pasta que estivesse na variável PATH…
E qual é a alternativa?
De nada adianta despejar toda essa explicação se o usuário ainda precisar verificar a saída de seu programa e, consequentemente, continuar utilizando a instrução system(“pause”);. Felizmente, existem alternativas.
- A solução mais correta é utilizar um ponto de parada (breakpoint) no depurador de sua IDE, antes da instrução return. Isso vai pausar a execução do programa antes de seu término e você poderá verificar seu resultado, sem precisar alterar a forma de como ele funciona.
- Outra solução, um pouco mais trabalhosa, é abrir uma janela do prompt de comando ou do PowerShell na pasta do seu programa e executá-lo de lá, digitando seu nome. Assim, você verá sua saída e a janela não se fechará no final.
- Se, mesmo assim, você precisar inserir uma função para pausar a execução de seu programa ao final, ao invés de syste(“pause”);, utilize a função getchar();, que é nativa da linguagem C.
Conclusão
A utilização da função system(“pause”); é uma má-prática de programação que deve ser evitada, pois prejudica a portabilidade, complica o fluxo de execução do programa e pode significar um enorme risco de segurança.
3 Comentários
Parabéns pelo artigo André! Muito bem explicado. Estou começando a aprender a linguagem Python e o que você mencionou era exatamente o que estava acontecendo comigo. Mas agora vou aprender como pausar o programa na IDE e deixar o os.system(‘pause’) de lado.
Obrigado pela informação!
Estou lendo um livro de ensino da linguagem C e o autor já inicia indicando o system (“pause”) como elemento típico do esqueleto de um programa em C.
#include
#include
int main (void){
printf (“Ola mundo\n”);
system (“pause”);
return 0;
}
Pode jogar esse livro na lixeira mais próxima.