1. Utilizando somente funções para leitura e escrita, considere o programa abaixo que copia um arquivo. Este programa pode ser caracterizado pelos seguintes aspectos: a. o programa lê de um dispositivo padrão e escreve em um dispositivo padrão, ou seja, assume-se que esses dispositivos tenham sido definidos na "shell"; b. muitas aplicações assumem que a entrada padrão é o descritor 0 e a saída padrão é o descritor 1; neste exemplo nós assumimos 02 nomes STDIN\_FILENO e STDOUT\_FILENO definidos no arquivo de cabeçalho "unistd.h"; c. o programa não executa a operação "close" nos arquivos de entrada e de saída, ao invés disso, ele utiliza do fato de que quando um processo é terminado o UNIX fecha todos os descritores de arquivo; d. o exemplo funciona tanto para arquivos texto quanto para arquivos binário, desde que não haja diferença entre os 02 núcleos do UNIX.
#include ``ourhdr.h'' #define BUFFSIZE 8192 int main( int argc, char* argv[ ] ) { int n; char buff[BUFFSIZE]; while( (n = read(STDIN_FILENO, buff, BUFFSIZE)) > 0 ) { if( write(STDOUT_FILENO, buff, n) != 0 ) err_sys(``write error''); } if( n < 0 ) err_sys("read error"); exit( 0 ); }
Como escolher o valor de BUFFSIZE ? Para responder a esta questão, execute o programa para diferentes valores de BUFFSIZE. Iniciando em 1 e utilizando a potência de 2, faça os valores variarem segundo a seqüência: 1, 2, 4, 8, 16, 32, 64, 128, até 16384. Para este teste, informe qual foi o tamanho do bloco do sistema de arquivo utilizado. Monte uma tabela informando para cada BUFFSIZE, o tempo utilizado pela CPU e o número de "loops". Analise os resultados e responda a pergunta inicialmente feita.