View Full Version : [C] interprete de comandos


br_viseu
20-05-2008, 15:47
Ola!!gostaria de saber se alguem me pode ajudar a fazer um interprete de comandos para unix com o C semelhante ao "command.com" do MSDOS....se alguem ja tivesse feito alguma coisa parecida ou assim agradecia

Mr. Brightside
20-05-2008, 15:51
Dúvidas concretas!

br_viseu
20-05-2008, 15:54
implementar comandos internos (dir,cd,date,etc....);executar programas;permitir definir variaveis de ambiente tais como PATH, PROMPT.....n sei como começar??

izanagi
20-05-2008, 19:04
Tens de detectar um comando:
- podes por exemplo ler da linha de comandos até que um enter for carregado.
Tens de fazer parse à linha de comandos:
- procuras pelos espaços e vais colocando o comando e os argumentos em strings.
Tens de identificar o comando e chamar o método correspondente:
- Comparas o 1º arg. com uma lista de comandos conhecidos e mapeias para uma função qq qur te faça o resultado esperado em DOS.

The_True_Eue
21-05-2008, 17:43
Algumas direcções:
Se quiseres podes usar a biblioteca readline, que ajuda com a leitura dos comandos (e até manutenção do histórico). Manual do sistema (man readline)... etc...
Para executar programas, fork() e exec(). Vê no manual mais detalhes...
Para aquela parte do "procuras por espaços" e assim podes usar wordexp (mais uma vez, man wordexp). Esta pode parecer um pouco esquisita e/ou complicada à primeira, mas no fundo é bastante simples.
Para as variáveis de ambiente, tens de manter uma lista de estruturas com pares de strings ou assim. Tipo uma hash-table, se souberes o que isso é. Se não souberes o que são hash-tables (e não estiveres praí virado) podes implementar uma simples lista ligada de pares.

Se os manuais não forem suficientemente esclarecedores... pergunta...

Algum código para exemplificar o uso de readline e wordexp:

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

// Variável para guardar um comando
char* cmd;
// Variável para guardar as palavras de um comando (nome do programa e argumentos)
wordexp_t words;
// Variável para guardar o valor de saída do comando
int status;

// Ler um comando
cmd = readline("prompt: ");
// Adicionar ao histórico
add_history(cmd);

// Dividir o comando em palavras
wordexp(cmd, &words, 0);

// Lançar um processo para correr o comando
if(fork())
{
// Aqui é o interpretador
wait(&status);
// Processar o resultado, etc...
}
else
{
// Aqui é o comando
execvp(words.we_wordv[0], words.we_wordv);
}


É mais ou menos isto...

The_True_Eue
27-05-2008, 09:40
Fiz isto na última aula de Sistemas Operativos. É um programa que faz pipes.

#include <stdio.h>
#include <wordexp.h>
#include <sys/types.h>
#include <unistd.h>
#include <malloc.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
int rp;
int wp[2];
int i;
wordexp_t words;

rp= 0;
for (i = 1; i < argc - 1; i++)
{
pipe(wp);
if(!fork())
{
if(rp)
{
dup2(rp, 0);
close(rp);
}

dup2(wp[1], 1);
close(wp[1]);
close(wp[0]);

wordexp(argv[i], &words, 0);
execvp(words.we_wordv[0], words.we_wordv);

exit(EXIT_FAILURE);
}

close(rp);
rp = wp[0];
close(wp[1]);
}
dup2(rp, 0);
close(rp);

wordexp (argv[i], &words, 0);
execvp (words.we_wordv[0], words.we_wordv);
}