Repositório para projeto de interpretador por linha de comando (shell) para a disciplina de Sistema Operacional
Um shell, mais simples que aquele executado num sistema Unix, deverá ser implementado nessa atividade, sendo este capaz de ser executado de duas formas: interativo ou batch. No primeiro, deve-se apresentar o prompt nomeado com o login de seu email, e a/o usuária/o do shell irá digitar o comando no prompt. No modo batch, o shell é iniciado tendo um arquivo como argumento (batchFile), e este contem uma lista de comandos que devem ser executados. Neste último modo, o prompt não será apresentado, no entanto deve-se imprimir no terminal os comandos lidos do batchFile antes de executá-los. Nos dois formatos, o shell será finalizado com o comando exit. Mais de um comando pode ser apresentado por linha de comando, com o ponto-e-vírgula (;) separando cada um. Por exemplo, se a/o usuária/o digitar: myLogin seq> /bin/ls; /bin/ps O shell deve executar ambos os comandos. Contudo, a execução irá depender do estilo (style) do shell: sequencial ou paralelo. No primeiro, cada ação deve ocorrer uma por vez, da esquerda para a direita, num mesmo processo filho. Assim, no exemplo (1), primeiro o ls deve ser executado, e quando finalizado, o ps.
No estilo paralelo, ambas ações devem ser executadas em paralelo, por exemplo: myLogin par> /bin/ls; /bin/ps , nesse caso uma nova thread deve ser criada para cada comando, uma para o/bin/ls e outro para /bin/ps. Não há limites para o número de comando por linha. Nos dois estilos, o prompt deve estar disponível apenas quando as duas ações terminarem. Perceba ainda que mais de duas ações podem ser combinadas. Para determinar o estilo, a/o usuária/o deve digitar o comando style sequential ou style parallel no prompt, sendo o sequencial o estilo default. Atenção para indicar no prompt qual estilo esta ativado: seq para sequencial, como no exemplo (1), ou par para paralelo, descrito no exemplo (2). O shell ainda deve dar suporte:
-
pipe - a saída de um comando pode ser enviada como entrada de outro comando. Os comandos que estão sob o pipe estão separados pelo símbolo |. Por exemplo: myLogin seq> ls -l | sort -k 5 , em que a saída do ls -l será a entrada do comando sort.
-
redirecionamento de entrada e saída: a entrada e saída de comandos podem ser enviadas ou obtidas de arquivos usando o redirecionamento. Alguns exemplos: myLogin seq> date > datefile , em que a saída do comando date é salvo no arquivo datefile myLogin seq> a.out < inputifle , em que o programa a.out recebe as entradas a partir do conteúdo do inputfile myLogin seq> sort file.txt >> datafile , em que o comando sort adiciona sua saída no fim do arquivo datafile
-
criar o comando !! (history) que permite o/a usuário/a executar o último comando executado no prompt. Caso nenhum comando tenha sido executado, a mensagem No commands deve ser apresentada no prompt.
-
executar comando em background através do caractere & ao fim do comando. Por exemplo, ao executar o comando (7) myLogin seq> /bin/ls & , a ação é colocada em background, e a informação sobre a mesma é apresentada no prompt: myLogin par> [1] 1234 , em que é indicando o ID do processo (1234) e que é o primeiro colocado em background ([1]). Enquanto o comando estiver sendo executado em background, o prompt estará apto a aceitar novos comandos. Para o processo descrito em (8) retornar do background, deve-se digitar o comando fg 1 no prompt.
Algumas especificações:
-
O programa deve usar fork(), exec(), wait(), dup2(), pipe(), pthread_create() e pthread_join(). O shell será um processo pai que executa, através de processos filhos (ou threads), o que for apresentado na linha de comando, seja digitada/a pela/o usuária/a ou lida do arquivo.
-
O programa deve ser implementado em C e ser executável em sistemas Linux, Unix ou macOS, com a compilação feita por Makefile, através simplesmente do comando make via terminal, e retornar o arquivo com nome shell executável;
-
A execução deve ser realizada utilizando comando ./shell [batchFile], em que o batchFile é opcional. Se o argumento não estiver presente, o shell deve executar no modo interativo. ATENÇÃO: o nome do arquivo de entrada não necessariamente será batchFile.
O programa não deve falhar se encontrar um erro, precisando checar todos os parâmetros antes de aceita-los. Assim, seu programa deve apresentar um mensagem de erro coerente, ou continuar o processamento ou sair, a depender das situações, descritas abaixo:
- imprimir uma mensagem e encerrar a execução quando: • um número incorreto de argumento para os comando shell for passado • se o arquivo a se utilizado no modo batch não existir ou não puder ser aberto
- imprimir uma mensagem de erro e continuar processando • quando o comando não existe ou não puder ser executado
Algumas outras situações, que apesar de não serem erros, o shell deve tratar de forma coerente:
- linha de comando vazia dentro do prompt
- múltiplos espaços em branco dentro de uma linha de comando
- espaços em branco antes ou depois do ponto-e-vírgula (;)
- batchFile sem o comando exit e a/o usuária/o digitar CTRL-D no modo interativo
- Execução interativa, saída com exit e style sequential •Exemplo: myLogin seq> /bin/ls; /bin/ps
- Execução batch, saída com exit e style sequential •Exemplo: ./shell commands.txt
- Execução batch e interativa, saída com exit e style parallel •Exemplo: myLogin par> /bin/ls; /bin/ps
- Execução batch e interativa, saída com exit, style sequential e PIPE •Exemplo: myLogin seq> ls -l | sort -k 5; /bin/ps
- Execução batch e interativa, saída com exit, style parallel e PIPE •Exemplo: myLogin par> ls -l | sort -k 5; /bin/ps
- Execução batch e interativa, saída com exit, style sequential e redirecionamento •Exemplo: myLogin seq> date > datefile; /bin/ps
- Execução batch e interativa, saída com exit, style parallel e redirecionamento •Exemplo: myLogin par> date > datefile; /bin/ps
- Execução batch e interativa, saída com exit, style parallel or sequencial e history •Exemplo: myLogin seq> !!
- Execução batch e interativa, saída com exit, style parallel or sequencial e background •Exemplo: myLogin seq> date > datefile &
- Tratamento de erro e outras situações
Atividade Criada pelo Professor Erico Souza Texeira