Sistemas de Operação

Ano Lectivo de 2003/2004


Linha de Comandos

Em UNIX é comum passar argumentos a programas através da linha de comandos. Uma linha de comando UNIX consiste num conjunto de palavras separadas por espaços, tabs, ou backslash seguido do caracter mudança de linha (\n). Quando um utilizador escreve um comando, a shell apanha a linha de comando como uma string, determina nessa string qual a palavra correspondente ao comando do utilizador e constrói um vector de strings com os argumentos a passar ao programa que executa o comando. De seguida executa o programa passando-lhe os argumentos determinados.

Nesta aula pretende-se que implemente um programa que mostre uma prompt ao utilizador (por exemplo, 'my_prompt$ '), leia as strings correspondentes aos comandos que o utilizador for invocando, e para cada string lida chame uma função parse para estruturar os argumentos correspondentes ao comando invocado e uma função print_parse para imprimir o conteúdo da estrutura retornada por parse. O programa deve terminar quando o utilizador invocar o comando exit.

Para tal, considere o extracto de código que se segue e complete-o de acordo com as indicações referidas:

#include <stdio.h>
#include <readline/readline.h>
#include <readline/history.h>

#define MAXARGS 100
typedef struct command {
   char *cmd;              /* String apenas com o comando */
   int  argc;              /* número de argumentos */
   char *argv[MAXARGS+1];  /* Vector de argumentos do comando */
} COMMAND;

COMMAND parse(char *linha);
void print_parse(COMMAND com);

main() {
  char *linha;
  COMMAND com;
 
  while (1) {
    while (strlen(linha = readline("my_prompt$ ")) == 0) {
      free(linha);   /* Ignora linhas vazias */
    }
    add_history(linha);
    com = parse(linha);
    print_parse(com);
    free(linha);
  }
}

COMMAND parse(char *linha) {
  /* ... */
}

void print_parse(COMMAND com) {
  /* ... */
}