Este projeto implementa um interpretador de comandos (shell) em C para manipulação de um sistema de arquivos customizado, conforme proposto na disciplina de Sistemas Operacionais 2.
O shell simula um sistema de arquivos simples, utilizando o filesystem do SO como base, mas garantindo que todos os dados fiquem contidos dentro do diretório fs/
.
fs/
├─ blocks/ # Blocos de dados (arquivos .dat)
├─ inodes.dat # I-nodes sequenciais
├─ freespace.dat # Gerenciamento de blocos livres
├─ superblock.dat # Metadados do sistema de arquivos
└─ .mickey.txt # Arquivo de teste com o conteúdo "Disney"
Regras do sistema de arquivos:
- Cada diretório deve possuir os diretórios
.
(atual) e..
(pai). - Todos os i-nodes são criados como livres antes do uso.
- O gerenciamento de blocos livres é armazenado em
freespace.dat
. - Todos os arquivos e diretórios permanecem entre execuções.
- Limite de nomes de arquivos: 14 bytes.
- Blocos de dados têm tamanho definido no
superblock.dat
.
Comando | Descrição | Exemplo |
---|---|---|
mkdir <nome> |
Cria um diretório no diretório atual | $ mkdir usuarios |
cd <caminho> |
Muda o diretório atual | $ cd /usuarios |
pwd |
Mostra o diretório atual | $ pwd → /usuarios |
touch <arquivo> |
Cria um arquivo com conteúdo digitado pelo usuário | $ touch teste.txt + conteúdo + <CTRL+D> |
cat <arquivo> |
Exibe o conteúdo de um arquivo | $ cat teste.txt |
ls |
Lista arquivos e diretórios do diretório atual | $ ls |
rm <nome> |
Remove arquivo ou diretório | $ rm arquivo.txt |
stat |
Exibe informações do filesystem | $ stat |
-
Função
command_execute()
- Interpreta comandos digitados pelo usuário.
- Converte o nome do comando para maiúsculas e identifica o código correspondente.
- Suporta:
MKDIR
,CD
,PWD
,TOUCH
,CAT
,DIR
,RM
,STAT
. - Valida parâmetros e exibe mensagens de erro quando necessário.
- Retorna
true
em sucesso efalse
caso contrário.
-
Comando
MKDIR
(mkdir_execute()
) -
Comando
CD
(cd_execute()
) -
Comando
PWD
(Windows) (pwd_execute()
)- Exibe diretório atual usando
_getcwd()
da biblioteca<direct.h>
. - Retorna
true
em caso de sucesso,false
em caso de erro.
- Exibe diretório atual usando
-
Comando
TOUCH
(touch_execute()
) -
Comando
CAT
(cat_execute()
)- Abre arquivo com
fopen()
e lê caractere por caractere (fgetc()
). - Exibe conteúdo no terminal (
putchar()
). - Retorna
true
se leitura bem-sucedida,false
em caso de erro. - Fecha arquivo com
fclose()
. - Exibe mensagem de erro caso o arquivo não possa ser aberto.
- Abre arquivo com
-
Comando
LS
(ls_execute()
) -
Comando
RM
(rm_execute()
) -
Comando
STAT
(stat_execute()
)
Esta seção será atualizada conforme novos comandos forem implementados.
- Blocos de dados: Arquivos dentro de
fs/blocks
com tamanho definido emsuperblock.dat
. - I-nodes: Armazenados em
inodes.dat
sequencialmente, todos livres inicialmente. - Gerenciamento de espaço livre: Arquivo
freespace.dat
. - Diretórios: Devem ter
.
(atual) e..
(pai). - Persistência: Arquivos e diretórios permanecem entre execuções.
- Clone o repositório:
git clone https://github.com/seu-usuario/shell-c.git
cd shell-c
- Compile o projeto:
gcc -o shell main.c filesystem.c commands.c
- Execute o shell:
./shell
- Implementação dos comandos
MKDIR
,CD
,TOUCH
,LS
,RM
,STAT
. - Melhorias na persistência e performance da busca por arquivos.
- Validação avançada de parâmetros e tratamento de erros.
- Suporte multiplataforma (Linux/Windows).
shell-c/
├─ fs/ # Diretório do filesystem
├─ main.c # Loop principal do shell
├─ filesystem.c # Funções de manipulação do FS
├─ commands.c # Implementação dos comandos
├─ commands.h
├─ filesystem.h
└─ README.md