Desenvolvido para a matéria de Arquitetura de Sistemas Operacionais - UFSC
- g++
- c++14
- Biblioteca pthread incluida no SO (Já incluída nas flags do computador no MakeFile)
- Para visualização correta, máquina com pelo menos 2 threads reais
Utilize o arquivo make disponível. Navegue até a pasta raiz e execute
make
Um executavel será gerado dentro da pasta bin.
Acesse o executável partindo da raiz
./bin/sfs
Caso tudo tenha ocorrido bem, a mensagem de inicilização abaixo será mostrada
[Common] Iniciando criação de socket listener /tmp/DefaultConnection.sock
[Common] Limpando /tmp/DefaultConnection.sock
[Common] Ouvindo socket /tmp/DefaultConnection.sock
A pasta ./sfs-home é o local utilizado como relativo nas conexões. Qualquer usuário que se conecte por um socket, será iniciado na pasta raiz relativa home, que é a placa absoluta ~/..../sfs-home, sendo "...." o local onde foi clonado este projeto.
- Estabelece uma conexão via socket, sendo possível acessar os sistema de arquivos unix por meio do terminal.
- Cada conexão é gerenciada por uma thread e possui um endereço relativo fictício no sistema de arquivos do SO.
- Operações de remoção e leitura de arquivos são encapsuladas por uma classe genérica de mutex para proteger e evitar condições de corrida.
- Nas operações de escrita e leitura foram colocados timers para ser possível a visualização do bloqueio do recurso pelo mutex da thread.
Não é necessário a criação de um cliente. É possível usar utilitários para escrita e leitura em um socket como por exemplo netcat ou socat
Com o netcat instalado, execute em um terminal paralelo usando o argumento -U para unix domain socket
nc -U /tmp/DefaultConnection.sock
Com o socat instalado, execute em um terminal paralelo
socat - UNIX-CONNECT:/tmp/DefaultConnection.sock
Comandos marcados com * são obrigatórios e podem ser usados com um caminho que antecede seu segundo argumento. Caso não sejam supridos, o comando não será executado.
Comando | Ação |
---|---|
vdir path | Visualiza diretório path, caso path seja vazio, visualize diretório atual |
edir *path | Entra em no diretório path |
cdir *newdir | Cria um diretório chamado newdir |
rdir *dir | Remove um diretório dir, caso esteja vazio |
cfile *newfile | Cria um arquivo chamado newfile |
rfile *file | Remove um arquivo file |
vfile *file | Visualiza o texto de um arquivo file |
efile *file *text | Escreve uma sequencia de caracteres text em um arquivo file |
Após um acesso, o cliente receberá um pre-fixo no input do terminal, sendo X o número da sessão, como mostrado abaixo.
sfs@instance-X:/home/$
Já no servidor, será exibido uma mensagem do tipo Success com o identificador da thread atrelada a conexão, assim como o descriptor do socket. Note, o descriptor do socket também é o identificador da instância mencionada acima, logo, poderá ser usado para visualizar mensagens futuras.
[Success] Thread 140068240434944 criada com sucesso!
[Success] Nova conexão criada - Socket Descriptor: 5
O resultado do comando aparecerá no cliente, caso seja um comando de visualização de dado (vdir, vfile). Já no lado do servidor, será possível identificar o solicitante, e também, o comando solicitado, numa mensagem na tela do tipo Common.
[Common] Descriptor 5: vdir
Uma classe genérica mutex sempre encapsula um recurso, que para esse caso, sempre será um arquivo. Quando uma conexão, gerida por uma thread, dispara uma solicitação de leitura de arquivo, por exemplo, o recurso será bloqueado até o desuso.
[Common] Descriptor 5: vfile test
[Resource] Recurso e5b503a0 trancado pela thread 140068240434944
[Common] Abrindo arquivo ./test...
Qualquer outra conexão que tente acessar o recurso e5b503a0 mostrado acima, será bloqueada até liberação, como mostrado abaixo por uma mensagem do tipo Warning:
[Common] Descriptor 6: vfile test
[Warning] Recurso e5b503a0 já está trancado, aguardando liberação...
Após certo tempo..
[Resource] Recurso e5b503a0 destrancado pela thread 140068240434944
[Resource] Recurso e5b503a0 trancado pela thread 140068232042240
[Common] Abrindo arquivo ./test...
O recurso foi destrancado pela conexão anterior, e imediatamente trancado pela conexão que estava no aguardo, gerida pela thread 140068232042240.