Trabalho 1 de FSO 2019-2
Data de Entrega 08/12/2019
O objetivo do trabalho é escrever um programa que dado um diretório origem faz a compactação recursiva de todos os arquivos pertecentes ao diretório origem e seus sub-diretórios. O algoritmo de compactação deve ser o utilizado pelo bzip2
, você pode utilizar as funções da biblioteca libbz2
. O que você não pode fazer é chamar o comando bzip2
diretamente.
Supondo que executamos o comando: bz2tar DIR DESTINO
O programa deve ter resultado equivalente a seguinte sequência de comandos:
cp -ax DIR_ORIGEM DESTINO.bz2
cd DESTINO.bz2
find . -type f -exec bzip2 "{}" \;
cd ..
tar cf DESTINO.bz2.tar DESTINO.bz2
rm -rf DESTINO.bz2
cd DIR_ORIGEM
find . -type f -exec md5sum "{}" \; > /tmp/checksum
cd ..
tar xf DESTINO.bz2.tar
cd DESTINO.bz2
find . -type f -exec bunzip2 "{}" \;
md5sum -c /tmp/checksum
OBSERVAÇÃO: Isto não é a mesma coisa de um tar.bz2
Onde DIR_ORIGEM
é o diretório de origem dos dados, podendo conter um número indefinido de sub-diretórios e DESTINO.bz2.tar
é o arquivo que vai conter o backup com arquivos compactado de DIR_ORIGEM
.
tar
, preferência se comunicando com ele via PIPE
.
popen(2)
você não precisa de fato fazer a cópia dos arquivos para DIR_TMP
. Tudo pode ser feito em memória.
para percorrer a árvore de diretório você deve utilizar as funções relacionadas da libc (não vale chamar um ls -lR
)
você não deve se preocupar com as permissões dos arquivos.
deve ser possível recuperar o backup que você utilizando os comandos tar
e bzip2
.
Uma opção seria utilizar uma thread (linha de execucação) para cada arquivo a ser compactado. Entretanto para um número grande de arquivos rapidamente seriam esgotados os recurso do sistema.
A solução é implentar um pool of consumers, um conjunto de threads que executa a função de compactar os arquivos. O pool consome um buffer onde cada entrada possui uma estrutura mínima (pode ser necessários outros campos):
O pool of producer é responsável por produzir esse buffer, ou seja, percorrer o diretório de origem, abrir o arquivo de origem (infd) e criar o arquivo de destino (outfd) alimentando o buffer.
A medida que os arquivos compactados são gerados eles devem alimentar um tar
.
A avalição será feita conforme combinado em sala.
O seu programa será avaliado dentro do sistema MOJ com diversas etapas, conforme abaixo
As submissões estarão disponíveis a partir do dia 2 de dezembro.
O trabalho deverá ser defendido quando a diferença entre a nota do trabalho e a média das provas for maior que 40.
Kay A. Robbins, S. Robbins, Unix Systems Programming: Communication, Concurrency, and Threads.
Advanced Linux Programming by Mark Mitchell, Jeffrey Oldham, and Alex Samuel, of CodeSourcery LLC