Jump to content

Shell


Alvess
 Share

Recommended Posts

#include "myshell.h"

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

void type_prompt(void) {

printf("\nComando: ");

}

void read_command(char *cmd, char *params[]) {

char linha[256];

if(gets(linha) != NULL) {

printf("%s", linha);

strcpy(cmd, "/bin/ls");

strcpy(params[0], "/bin/ls");

strcpy(params[1], "-l");

params[2] = (char *) 0;

}

Olá Pessoal tenho este problema,não sei como desenvolver aquilo.Por favor ajude-me a resolver.

Muito Obrigado.

Link to comment
Share on other sites

Guest user14912

A problema é para criar uma shell em C,e que o utlizador um comando e depois espera por o processo parametros,e depois de introduzido devolve o parametro.

Do que disses-te nada tem sentido, mas presumo que queiras criar um pequena Shell em C.

Muito bem, quais os passos a seguir.

Poderás construir um algoritmo da seguinte maneira:

  • O programa rodar em torno de um bloco iterativo
  • Pedir ao utilizador o comando, executa-lo e voltar ao bloco iterativo, esperando por um novo comando

Muito bem, simples de perceber, é só isto que tínhamos de pensar primeiramente.

Como fazer então isto?

Fácil, repara:

PS:[Vou fazer com os parâmetros argv e argc do main, assim temos a vantagem de executar o programa externamente pela linha de comando do SO, tal como acontece com o shell]


//funcao main com os parametros

int main(int argc, char *argv[]){
    
    //ciclo infinito ate'..
    while(1){
             
             //sair da shell, aqui podias implementar uma função e passar o vector de apontadores argv
            if(strcmp(argv[1],"sair")==0)
                break;                                        
         
    }


printf("byebye, obrigado por visitar a nossa shell");
return 0;    
}

E pronto, tens aí um pequeno prototipo da shell.

Inicialmente temos no main o argc e o argv, em que:

argc-> é o número de string para qual o vector de apontadores argv aponta.

argv-> é um vector de apontadores, cada posição do vector aponta para um bloco de strings.

Por exemplo, na linha de comandos fazias:

:> programa ls -l

Então neste caso, argc==3 e o argv[0]==programa,argv[1]==ls,argv[2]==-l.

Não sei se fui muito claro, mas penso que já deves ter percebido como começar a sua implementação.

Qualquer dúvida diz, good work  😁

Link to comment
Share on other sites

Eu já tinha perguntado há uns dias atrás (dia 29) noutro tópico aqui (com o nome de Shell também).

O problema é este. Temos de implementar mais comandos no parsecmd.c (é o nome do ficheiro. o alvess deve ser da minha escola).

Precisamos de um if ou um switch para executar vários comandos. O que queremos é : aparece a prompt "Command:" e depois inserir ls. Depois disso ele pede o parametro e inserimos -l e a shell executa o ls -l.

Agora ele faz automaticamente bastando carregar no enter ou outro caracter.

Vai ver o meu tópico sobre a Shell. Estão lá os ficheiros todos menos o makefile.

Abraço.

Link to comment
Share on other sites

Guest user14912

Sempre podes ser mais criativo na shell e fazer operações do género system("ls -ls"); mas programadas por ti 🙂

Por exemplo a biblioteca <dirent.h> permite-te abrir um directório e colocar  numa estrutura o nome dos ficheiros, depois podes brincar um bocadinho 🙂

Quem diz esta biblioteca diz outras, porque não trabalhar um bocadinho mais em "baixo nível"  😁

Link to comment
Share on other sites

Desculpe, a pergunta é assim;

Pretende-se com este trabalho implementar uma shell em Linguagem C para o sistema operativo UNIX/LINUX.

Assim, esta deverá apresentar uma prompt ao utilizador e aguardar que sejam introduzidos comandos. Após a introdução de um comando (e eventuais parâmetros) a shell deverá coloca-lo em execução e apresentar novamente a prompt ao utilizador quando a execução terminar.

Por favor ajude me a resolver o meu problema.

Link to comment
Share on other sites

Guest user14912

Tão o teu problema já foi mais que resolvido 🙂

Em cima deixei-te um pequeno prototipico, já com um comando (sair) e como podes ir buscar o comando ao vector de apontadores, agora é fazeres o mesmo para os outros comandos.

A segunda hipótese que te dei foi, ou fazes isso com chamadas ao sistema do tipo system("ls -l"); ou constrois tu essas próprias funções.

PS: Se o fizeres com a primeira hipotese "chamadas ao sistema" o trabalho não tem um grau de dificuldade tão elevado (para ser sincero, não tem qualquer dificuldade), agora depende do que o teu professor queira e de como queira que façam 😉

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.