Script Muuuuuito lento

13. Re: Script Muuuuuito lento


oxidante

(usa Debian)

Enviado em 27/04/2018 - 22:11h

Paulo, depois de testar os códigos que vc postou, me surgiu uma dúvida. Criei um simples programinha em C que escreve para um arquivo texto usando a função putc(c,arq) (código abaixo), e notei que o arquivo de destino não é preenchido imediatamente, "char por char". Ele só escreve os bytes de fato depois de atingir um número específico de bytes (no meu caso, 5120 bytes). Sabes me dizer onde exatamente fica armazenado esse buffer temporário e se tem como modificar seu tamanho?

#include <stdio.h>
#include <stdlib.h>
int main(){
FILE *fd = fopen("a.txt","w");
int i;

// testar com os valores: 1024, 2048, 4096, 5120, 8192
for(i=0;i<1024;i++)
fputc('a',fd);

// pausa aqui para visualizarmos o conteúdo
// do arquivo usando um programa externo
// ex: cat a.txt
getchar();

fclose(fd);
return 0;
}



  


14. Re: Script Muuuuuito lento

Paulo
paulo1205

(usa Ubuntu)

Enviado em 29/04/2018 - 06:06h

Existe um buffer no nível da biblioteca do C. Cada stream de entrada e saída pode ter um buffer associado, e você pode definir características do buffer de cada stream por meio da função setvbuf().

Além do buffer da biblioteca, existe também o buffer em nível de sistema operacional, que pode fazer com que um dado permaneça na memória do sistema antes de ser jogado para o disco. Contudo, se estivermos falando de disco local e de dois processos executando na mesma máquina, esse buffer provavelmente não impediria o segundo processo de ver o conteúdo do arquivo gerado pelo seu programa, pois o sistema seria esperto o bastante para trazer o conteúdo da memória, mesmo que ele ainda não tenha sido descarregado para o disco.


15. Re: Script Muuuuuito lento


oxidante

(usa Debian)

Enviado em 29/04/2018 - 23:47h

paulo1205 escreveu:

Existe um buffer no nível da biblioteca do C. Cada stream de entrada e saída pode ter um buffer associado, e você pode definir características do buffer de cada stream por meio da função setvbuf().

Além do buffer da biblioteca, existe também o buffer em nível de sistema operacional, que pode fazer com que um dado permaneça na memória do sistema antes de ser jogado para o disco. Contudo, se estivermos falando de disco local e de dois processos executando na mesma máquina, esse buffer provavelmente não impediria o segundo processo de ver o conteúdo do arquivo gerado pelo seu programa, pois o sistema seria esperto o bastante para trazer o conteúdo da memória, mesmo que ele ainda não tenha sido descarregado para o disco.

Obrigado pela informação Paulo, desconhecia essa função setvbuf. Por padrão, então, o meu programa estava rodando no modo "block buffered" (_IOFBF), o qual só escreve para o arquivo após o buffer ficar cheio. Depois de criar um buffer do tipo char de 1024 e setar o modo "unbuffered" (_IONBF), agora consigo visualizar o conteúdo do arquivo antes da pausa.



01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts