Shell> sosh
Elementos do Grupo: Amlcar Fernandes: [ ei99079@fe.up.pt]
Faculdade de Engenharia da Universidade do Porto Departamento de Engenharia Electrotcnica e de Computadores Rua Roberto Frias, s/n, 4200-465 Porto, Portugal
Outubro 2009
Shell SOSH Pgina 1
Resumo
Shell SOSH um interpretador de comandos do Sistema Operativo Linux. Trabalho proposto foi desenvolvido no mbito de disciplina de Sistemas Operativos, do 3 ano de Mestrado Integrado em Engenharia Informtica e Computao, da Faculdade de Engenharia da Universidade do Porto. Programa cumpre todos os objectivos propostos para desenvolvimento deste trabalho. Sem contar com a parte de valorizao que no foi implementada. Neste relatrio, encontram-se descritas as funcionalidades do programa que foram implementadas, as fases de desenvolvimento, bem como a compilao e execuo.
Shell SOSH
Pgina 2
ndice
1. Resumo 2. Introduo 1. Objectivo 2. Motivao 3. Shell SOSH 1. Introduo 2. Funcionalidades e Usabilidade 3. Descrio 4. Execuo do Programa 5. Resultados Obtidos 4. Desenvolvimento 1. Descrio de Ferramenta de Desenvolvimento 2. Mdulo SOSH 3. Implementao 4. Arquitectura 5. Estrutura do Programa 5. Concluso e Perspectivas de Desenvolvimentos Futuros 6. Bibliografia
Shell SOSH
Pgina 3
Glossrio
Shell SOSH programa de interpretao de comandos de Sistema Operativo Linux. quem comando SOSH para executar comando Unix num processo independente. psu comando SOSH lista processos em execuo do utilizador actual. ver comando SOSH imprime no stdout a verso do programa. ajuda comando SOSH lista os comandos suportados. localiza comando SOSH localiza todos os caminhos absolutos onde aparece um comando passado como parmetro. exit comando SOSH termina e sai do programa. execv famlias da funo exec(), permitem lanamento de execuo de programas externos ao processo. Nesta funo, o nmero de argumentos do programa lanado desconhecido. execvp idem a descrio de cima, feito no execv, sendo que, esta funo, fornece um vector de apontadores para strings no nulas que representam a lista de argumentos do programa que se pretende executar. execlp idem a descrio de cima, feito no execv, mas nesta funo, o argumento uma lista passada como parmetro na linha de comando, que descrevem uma lista ou mais de apontadores para strings no nulas e que representam a lista de argumentos do programa que se pretende executar.
Shell SOSH
Pgina 4
Lista de figuras
[Figura 1: Shell SOSH Execuo do comando: quem] -------------------------------------Pg. 8 [Figura 2: Shell SOSH Execuo do comando: psu] ----------------------------------------Pg. 8 [Figura 3: Shell SOSH Execuo do comando: ver] ----------------------------------------Pg. 9 [Figura 4: Shell SOSH Execuo do comando: ajuda] -------------------------------------Pg. 9 [Figura 5: Shell SOSH Execuo do comando: localiza] ------------------------------------Pg. 10 [Figura 6: Shell SOSH Execuo do comando: exit] ----------------------------------------Pg. 10 [Figura 6: Shell SOSH Execuo do comando: /usr/bin/ cmd] ---------------------------Pg. 11 [Figura 8: Arquitectura de Aplicao Shell SOSH] --------------------------------------------Pg. 13 [Figura 9: Estrutura do Programa SOSH] ------------------------------------------------------Pg. 13
Shell SOSH
Pgina 5
Introduo
Ao longo deste relatrio, salientam-se duas abordagens principais inerentes funcionalidades do programa e ao desenvolvimento do mesmo: Shell SOSH descreve funcionalidades do programa que foram implementadas, compilao e execuo. Desenvolvimento descreve fases de implementao, arquitectura e estrutura do programa.
1. Objectivos
Familiarizar com a interface de desenvolvimento de sistemas baseados em Unix. Consolidao de tcnicas de programao de aplicaes, do domnio Shell, recorrendo a utilizao de interfaces disponibilizadas pelo Sistema Operativo.
2. Motivao
Consolidao de competncias tcnicas, no domnio de desenvolvimento de aplicaes que interpretam os comandos do sistema Unix. E desenvolver, por outro, capacidades de utilizar e explorar melhor, os recursos que o Sistema Operativo disponibiliza.
Shell SOSH
Pgina 6
Shell SOSH
1. Introduo
Shell SOSH explora as potencialidades dos recursos disponibilizados pelo Sistema Operativo UNIX para implementar funcionalidades, baseadas na utilizao de interface de desenvolvimento do sistema.
2. Descrio
Shell SOSH, l os comandos introduzidos pelo utilizador, interpreta-os de acordo com a semntica definida no programa e apresenta os resultados na consola. O interpretador reconhece sete comandos descritos por ordem nos pontos a seguir.
3. Funcionalidades e Usabilidade
Shell SOSH disponibiliza sete funcionalidades implementadas. Essas funcionalidades esto descritas com mais detalhe no ponto a seguir. A partir do ambiente Shell SOSH, o utilizador pode consultar os processos em execuo, ver a verso actual do programa, aceder ao menu ajuda, localizar os caminhos dos comandos ou executar aplicaes localizadas no /usr/bin.
4. Execuo do Programa
Para executar o programa, foi criado um Makefile para fazer a ligao do programa e gerar automaticamente o ficheiro executvel sosh. Executar make na linha de comando: shell> make Arrancar o programa: shell> sosh <nome de comando> e ou <argumentos> Nome de comandos e argumentos (ver a descrio no Glossrio): shell> sosh quem shell> sosh psu shell> sosh ver shell> sosh ajuda shell> sosh localiza <path> <comando> shell> sosh exit shell> sosh /usr/bin/ <comando> <argumento>
Shell SOSH
Pgina 7
5. Resultados Obtidos
A seguir so apresentados os resultados obtidos com a execuo dos comandos descritos acima.
Shell SOSH
Pgina 9
Shell SOSH
Pgina 10
Desenvolvimento
1. Descrio de Ferramenta de Desenvolvimento
Todo o programa foi desenvolvido no ambiente UNIX, utilizando a linguagem de programao C. A linguagem de programao C, disponibiliza bibliotecas com funes bastante teis, que permitem criar aplicaes capazes de utilizar interface de desenvolvimento do sistema UNIX.
2. Mdulo SOSH
SOSH o mdulo principal do programa. Todos os programas implementados so chamados neste mdulo.
Shell SOSH
Pgina 11
Implementa os mecanismos para a manipulao dos dados passados no ambiente Shell SOSH. Possui estruturas definidas, para suportar os dados de entrada, de formas a armazena-los correctamente, afim de serem utilizados para gerar resultados de sada desejveis.
3. Implementao
O programa foi implementado por etapas. Na primeira etapa, foi desenvolvida a primeira verso do sosh0.1. Para esta fase, foi implementada uma funcionalidade, que reconhece o comando quem que por sua vez executa o comando UNIX who. Na segunda etapa, foi desenvolvida a segunda verso de aplicao sosh0.2 onde foi implementada outras cinco funcionalidades, j descritos anteriormente; psu, ver, ajuda, localiza e exit. Na terceira etapa, a verso sosh0.3 foi implementado um programa que permite a execuo de aplicaes localizadas no /usr/bin. Produto resultante est compactado num mdulo com trs ficheiros: cmds.h contm o prottipo dos programas implementados. cmds.s contm todos os programas desenvolvidos para suportar os comandos segundo a semntica Shell SOSH. sosh.c o ficheiro que contm o programa principal.
Shell SOSH
Pgina 12
4. Arquitectura
Shell SOSH alm de chamadas programas internos do mdulo, utiliza recursos da interface de desenvolvimento do sistema disponveis. Recursos que aparecem especificados como segunda camada de Aplicao.
5. Estrutura do Programa
A aplicao resultante um mdulo com trs ficheiros, que contm implementao de todo o programa Shell SOSH. Como mostra a figura em baixo, alm dos trs ficheiros referido, tambm tem um Makefile para compilar o programa e gerar um executvel sosh automaticamente.
Shell SOSH
Pgina 13
Shell SOSH
Pgina 14
Bibliografia
[1]Tanenbaum, Andrew S.;Modern operating systems [2] - http://www.linux.com [2] - http://www.linuxsecurity.com.br/
Shell SOSH
Pgina 15
ANEXOS
Shell SOSH
Pgina 16
[Cdigos do programa]
shsh.c
#include <unistd.h> #include <sys/types.h> #include <signal.h> #include <sys/wait.h> #include <sys/stat.h> #include <sys/fcntl.h> #include <sys/dir.h> #include <sys/param.h> #include <dirent.h> #include <stddef.h> #include <stdlib.h> #include <stdio.h> #include <getopt.h> #include <string.h>
#include "cmds.h" #define MAX_LEN 1024 pid_t pid; void handler(int sig){ if (sig==SIGINT){ printf("Programa cancelado por sua ordem"); cmd_exit(pid); } } int main(int argc, char **argv){
Shell SOSH
Pgina 17
printf("Processo filho em execucao..."); printitle(); printf("\nPARA SAIR PRIMA CTRL - C\n"); } else { wait(&estado); printf("\nProcesso Pai aguarda Filho com PID: [%d]\n", pid); printf("\nValor de retorno: [%d]\n", WEXITSTATUS(estado)); /* DEFINIDAS AQUI ESTRUTURAS PARA FAZER PARSE DOS ARGUMENTOS PASSADOS NA LINHA DE COMANDO */ int i = 0, j; char *p; char buf[1024]; char *stringrec[1024];
if (argc < 2){ printf("USAGE: ./sosh <comand_name> <args>\n"); exit(0); } memset(buf,0,sizeof(buf)); for(j=0; j < argc; j++){ strcat(buf,argv[j]); if(j<argc) strcat(buf," "); } p = strtok(buf, " ");
Shell SOSH
Pgina 18
while (p != NULL){
stringrec[i] = p; printf("%d - %s\n", i, stringrec[i]); p = strtok(NULL, " "); i++; } do { int n; char cmd[MAX_LEN]; memset(cmd, 0, sizeof(cmd)); for (n=1; n < argc; n++){
if ((strcmp(stringrec[n], "quem"))==0){ strcpy(cmd, stringrec[n]); cmd_quem(cmd); cmd[n] = '\0'; } else if((strcmp(stringrec[n], "psu"))==0){ strcpy(cmd, stringrec[n]); cmd_psu(cmd); cmd[n] = '\0'; } else if((strcmp(stringrec[n], "ver"))==0){ cmd[n] = '0'; cmd_ver(); } else if((strcmp(stringrec[n], "ajuda"))==0){
cmd_ajuda();
Shell SOSH
Pgina 19
cmd_localiza(argv, argc); } else if((strcmp(stringrec[n], "exit"))==0){ cmd_exit(pid); } else if ((strcmp(stringrec[n], "/usr/bin/"))==0){ cmd_usrbin(argv, argc); } else { printf("\nComando Invalido!"); } } } while(argv != NULL); } return 0; }
Shell SOSH
Pgina 20
cmds.c
#include <unistd.h> #include <sys/types.h> #include <signal.h> #include <sys/wait.h> #include <sys/stat.h> #include <sys/fcntl.h> #include <sys/dir.h> #include <sys/param.h> #include <dirent.h> #include <stddef.h> #include <stdlib.h> #include <stdio.h> #include <getopt.h> #include <string.h>
#include "cmds.h"
Shell SOSH
Pgina 21
/* @printh()
< FUNCAO PRINTH IMPLEMENTADA APENAS PARA IMPRIMIR O CABECALHO QUE IDENTIFICA O PROGRAMA. */ void printh(){ puts("\n\t*********************"); puts("\tPROGRAMA SHELL - SOSH"); puts("\t>> puts("\tA J VERSAO .02 <<"); U D A");
puts("\t*********************\n"); }
/* @printitle()
< FUNCAO PRINTH IMPLEMENTADA APENAS PARA IMPRIMIR O CABECALHO QUE IDENTIFICA O PROGRAMA. */
Shell SOSH
Pgina 22
puts("\t>>
puts("\t***********************\n"); }
/* @cmd_psu(char *cmd)
< FUNCAO PSU IMPLEMENTADA. LISTA PROCESSOS EM EXECUCAO. < RECEBE COMO ARGUMENTO O COMANDO RECONHECIDO PELO SISTEMA - PSU < ATRAVES DO EXECVP EXECUTA O COMANDO PS */ int cmd_quem(char *cmd){
/* @cmd_psu(char *cmd)
< FUNCAO PSU IMPLEMENTADA. LISTA PROCESSOS EM EXECUCAO. < RECEBE COMO ARGUMENTO O COMANDO RECONHECIDO PELO SISTEMA - PSU
Shell SOSH
Pgina 23
/* @cmd_exit(int pid)
< FUNCAO EXIT IMPLEMENTADA. TERMINA O PROGRAMA PEMITINDO AO UTILIZADOR < ESCOLHER UMA DAS DUAS OPCOES (S / N): < (S) - TERMINA O PROGRAMA E FAZ KILL AO PROCESSO EM EXECUCAO CUJO O PID E' PASSADO COMO PARAMETRO DO EXIT. < (N) - PROGRAMA CONTINUA. */ void cmd_exit(int pid){
char msg; printf("Pretende Terminar Programa (S / N)?: \n"); fflush(stdin); printf("> "); msg = getchar();
Shell SOSH
Pgina 24
if (msg == 'S' || msg == 's'){ printf("\nPrograma vai terminar...\n"); sleep(1); printf("OK\n"); if (pid==0){ kill(pid, SIGKILL); } if (pid==1){ kill(pid, SIGKILL); }
exit(0); } else if (msg == 'N' || msg == 'n'){ while(1){ printf("\nPrograma continua\n"); cmd_exit(pid); } } else{ printf("\nComando Invalido!\n"); cmd_exit(pid); } fflush(stdout); }
Shell SOSH
Pgina 25
/* @cmd_localiza()
< FUNCAO LOCALIZA IMPLEMENTADA. RECEBE O PATH E COMANDOS COM ARGUMENTOS OU NAO < LISTA TODOS OS CAMINHOS ABSOLUTOS ONDE APARECE O COMANDO DADO COMO ARGUMENTO. < LISTA DIRECTORIOS E TODOS OS FICHEIROS QUE CONTEM. */ int cmd_localiza(char **argv, int argc){
char pathcat[MAX_LEN] ;
//- INICIALIZA BUF A ZERO ANTES DO PARSE PARA ELIMINAR CARACTERES INDESEJAVEIS. memset(buf, 0, sizeof(buf)); for (j=0; j < argc; j++){ strcat(buf, argv[j]); if (j < argc) strcat(buf, " "); }
Shell SOSH
Pgina 26
//- FAZ PARSER DOS DADOS DE ENTRADA PASSADOS PELA LINHA DE COMANDO p = strtok(buf, " "); while(p != NULL){
strings[i] = p; printf("%i - %s\n", i, strings[i]); p = strtok(NULL, " "); i++; } strings[i] = NULL;
//- COLOCA APENAS O PATH E O COMANDO A EXECUTAR NA VARIAVEL - pathcat. int k; memset(pathcat, 0, sizeof(pathcat)); for (k=2; k < 3; k++){ strcat(pathcat, strings[k]); }
printf("\nAbriu o directorio\n");
while ((entry = readdir(dir)) != NULL){ //if ((strcmp(entry->d_name, strings[2]))==0){ printf("%s \n", entry->d_name); //execv(pathcat, strings); execlp("find", "find", pathcat, pathcat, NULL); puts(" ");
Shell SOSH
Pgina 27
/* @cmd_ajuda(void)
< FUNCAO AJUDA IMPLEMENTADA. LISTA TODOS OS COMANDOS SUPORTADOS PELO SISTEMA. < LISTA NUMERO DE OPCOES CORRESPONDENTES A CADA COMANDO, PARA ACEDER MAIS < INFORMACOES SOBRE OS COMANDOS. */ int cmd_ajuda(void){ printh();
int opc;
Shell SOSH
Pgina 28
do { printf("\nLISTA DE OPCOES DOS COMANDOS SUPORTADAS PELO SISTEMA.\n\n"); puts("\nSeleccione uma opcao para mais informacao\n");
printf("\n[1] - QUEM\n"); printf("\n[2] - PSU\n"); printf("\n[3] - VER\n"); printf("\n[4] - AJUDA\n"); printf("\n[5] - EXIT\n"); printf("\n[6] - LOCALIZA\n"); printf("\n[7] - SAIR\n");
switch (opc){
case 1: printf("\n<quem> : Executa o comando <who>.\n"); printf("\nPara listar processos do utilizador.\n"); break;
Shell SOSH
Pgina 29
/* @cmd_ver(char *nome)
Shell SOSH
Pgina 30
< FUNCAO VER IMPLEMENTADA. MOSTRA A VERSAO DO SISTEMA < VERSAO SO SISTEMA IMPRIMIDO ATRAVEZ DO SDTOUT */ void cmd_ver(){
Informacao info;
lseek(fd, 0, SEEK_SET); while (fd != 0){ n = read(fd, &info, sizeof(info)); if (n==0){ //- fim do ficheiro break; } //printf("\nNome: %s\n", info.nome); //printf("\nValor: %f\n", info.valor); //printf("\nQuantidade: %d\n\n", (int)info.quantidade); }
Shell SOSH
Pgina 31
< FUNCAO USR_BIN IMPLEMENTADA. EXECUTA COMANDOS LOCALIZADOS NO /usr/bin/ < RECEBE O PATH E O NOME DO COMANDO A SER EXECUTADO. < USA - execv - PARA EXECUTAR COMANDOS */ int cmd_usrbin(char **argv, int argc){
memset(buf, 0, sizeof(buf)); for (j=0; j < argc; j++){ strcat(buf, argv[j]); if (j < argc)
Shell SOSH
Pgina 32
strings[i] = p; printf("%i - %s\n", i, strings[i]); p = strtok(NULL, " "); i++; } strings[i] = NULL;
printf("\nA executar comando: %s - %s\n", pathcat, files->d_name); execv(pathcat, strings); //- EXECUTA RESTO DE COMANDOS PASSOS COMO ARGUMENTOS puts(" ");
Shell SOSH
Pgina 33
} closedir(dir); } return 0; }
cmds.h
/* * cmds.h - sosh command module */
void printitle();
Shell SOSH
Pgina 34
void printh();
#endif
Shell SOSH
Pgina 35