Vous êtes sur la page 1sur 5

Trabalho de Sistemas Operacionais

Nome: Jefferson Miranda Tibrcio Execuo do programa Prof: Celso

Como o arquivo esta vazio ele retorna zero e depois termina a execuo.

Maisse o arquivo tiver algo armazenado dentro dele ele retorna o que esta dentro do arquivo vai a 1 e finaliza a execuo.

O programatem uma funcionalidade mnima e no chega a reportar erros, mas d uma ideia razovel de como funcionam algumas chamadas ao sistema relacionadas a arquivos.

Os quarto comandos #include logo no inicio do programa geram a incluso de uma quantidade de definies e prottipos de funes no programa. Essa incluses so necessrias para adequar o programa aos padres.
#include<sys/types.h> #include<fcntl.h> #include<stdlib.h> #include<unistd.h>

O primeirocomando #define a definio de uma macro que estabelece o tamanho de uma cadeia BUF_SIZE como uma macro que cresce ate um mximo de 4096. O programa ler e escrever em pedaos de 4096 bytes. O segundo comando #definedeterminara quem pode ter acesso ao arquivo de sada.
#define BUF_SIZE 4096 #define OUTPUT_MODE 0700

O programa principal e chamado main e tem dois argumentos, argc e argv, fornecidos pelo sistema operacional quando o programa chamado. O primeiro diz quantas cadeias de caracteres estavam presentes na linha de comando que invocou o programa, inclusive o nome do programa. No caso, deveriam ser trs. O segundo e um arranjo de ponteiros para os argumentos.
intmain(intarg, char * argv[]);

So declaradas cinco variveis. As duas primeiras ,in_fd e out_fd, contero os descritores de arquivo. Valores inteiros pequenos retornados quando um arquivo e aberto. As duas seguintes, rd_count e wt_count , so os contadores de bytes retornados pelas chamadas ao sistema read e write, respectivamente. A ltima, buffer , o buffer usado para conter os dados lidos ou disponibilizados para escrita.
intin_fd,out_fd,rd_count,wt_count; char buffer[BUF_SIZE];

O primeiro comando verifica se o valor de argc 3. Se no for,o programa terminar com um cdigo de status 1. Qualquer cdigo de status que no seja 0 significa a ocorrncia de um erro .
if(argc !=3) exit(1);

Ento tentamos abrir o arquivo de origem e criar o arquivo de destino. Se o arquivo de origem for aberto com sucesso, o sistema atribuir um pequeno valor inteiro in_fd para identificar o arquivo. As chamadas subsequentesdevem incluir esse valor inteiro a fim de que o sistema saiba qual arquivo ele quer. Da mesma maneira, se o arquivo de destino for criado com sucesso, um valor ser

atribudo a out_fd para identificar o arquivo. O segundo argumento de creat estabelece o modo de proteo. Se a abertura ou a criao falhar. O descritor do arquivo correspondente conter-1 e o programa sair com um cdigo de erro.
in_fd = open(argv[1],O_RDONLY); if(in_fd<0) exit (2); out_fd= creat(argv[2],OUTPUT_MODE); if(out_fd<0) exit(3);

Ento entra em ao o lao da cpia. Esse lao comea tentando ler 4 KB de dados para o buffer. Isso e feito por meio da chamada ao procedimentode biblioteca read, que na verdade invoca a chamada ao sistema read. O primeiro parmetro identifica o arquivo , o segundo fornece o buffer e o terceiro informa quantos bytes devero ser lidos. O valor atribudo a rd_count forneceo nmero de bytes realmente lidos . normalmente seriam 4096, a no ser que restassem apenas alguns bytes no arquivo . Quando o fim do arquivo e alcanado , o nmero de bytes 0. Se rd_countfor 0 ou negativo, a cpia no poder prosseguir e assim o comando break ser executado para finalizar o lao.
while(TRUE) { rd_count = read(in_fd,buffer,BUF_SIZE); if(rd_count<=0) break; wt_count = write(out_fd, buffer,rd_count); if(wt_count<=0)exit(4); }

A chamada writedescarrega o buffer no arquivo de destino. O primeiro parmetro identifica o arquivo, o segundo fornece o buffer e o terceiro informa quantos bytes escrever, semelhante aread. Observe que o contador de bytes o nmero de bytes realmente lido e no o BUF_SIZE. Isso importante porque a ltima leitura no retorna 4096, a menos que o arquivo coincidentemente tenha um tamanho mltiplo de 4KB.
wt_count = write(out_fd, buffer,rd_count); if(wt_count<=0)exit(4);

Quando todo o arquivo tiver sido processado, a primeira chamada alm do fim do arquivo retornar 0 em rd_count, o que o fara sair do lao. Nesse ponto, os dois arquivos so fechados e o programa sai com o status indicando um trmino anormal.
close(in_fd); close(out_fd); if(rd_count ==0) exit(0); else exit(5);

Vous aimerez peut-être aussi