Este projeto implementa um interpretador de comandos simples (Shell) utilizando a linguagem Python e chamadas diretas ao sistema operacional (system calls) para gerenciamento de processos e E/S.
Como este shell é escrito em Python, basta ter o interpretador Python 3 instalado, abrir o terminal na pasta onde está o arquivo e executar o comando:
python3 main.py| Função Python | Chamada ao sistema real | Função no projeto |
|---|---|---|
os.read() |
read() |
Ler comandos digitados |
os.write() |
write() |
Exibir mensagens no terminal |
os.fork() |
fork() |
Criar processo filho |
os.execvp() |
execvp() |
Executar comandos externos |
os.wait() |
wait() |
Fazer o processo pai aguardar |
os._exit() |
_exit() |
Encerrar o processo filho após erro |
-
Entrada:
> ls -
Saída:
shell.py README.md
-
Entrada:
> echo hello world
-
Saída:
hello world
-
Entrada:
> cat main.py -
Saída:
import os def writeMessage(message): os.write(1, message.encode()) def readCommand(): writeMessage("> ") data = os.read(0, 1024) return data.decode().strip() def executeCommand(string): commands = string.split() command = commands[0] childProcess = os.fork() isParentProcess = childProcess > 0 if isParentProcess: os.wait() return try: os.execvp(command, commands) except FileNotFoundError: writeMessage(f"Comando não encontrado: {command}\n") except Exception as e: writeMessage(f"Erro ao executar comando: {str(e)}\n") os._exit(1) def main(): command = readCommand() while (command != "exit"): executeCommand(command) command = readCommand() main()
-
Entrada:
> banana -
Saída:
Comando não encontrado: banana
-
Entrada:
> exit
-
Saída:
O shell é encerrado sem mensagem adicional
-
Sem suporte a cd (Change Directory): O comando cd deve ser um comando interno (built-in) do shell. Se você executar cd /tmp neste shell, ele rodará em um processo filho. O filho mudará de diretório e morrerá, mas o processo pai (o shell) permanecerá no diretório original.
-
Sem Histórico: Pressionar a seta para cima (↑) não trará o comando anterior (imprimirá códigos de escape brutos).
-
Buffer Limitado: A leitura de comandos está limitada a 1024 bytes (os.read(0, 1024)).
-
Tratamento de Sinais: O shell não trata sinais como SIGINT (Ctrl+C), o que interromperá o shell inteiro ao invés de apenas o processo filho.