/ / Truncar arquivo afeta o processo de leitura - c, linux

Arquivo truncado afeta o processo de leitura - c, linux

Recentemente, estou lendo os sistemas UNIXProgramando e fazendo algum teste. Estou confuso por isso que eu truncar o arquivo com truncar comando no terminal, em seguida, o processo de leitura ler a mesma posição retornar 0 que retornar a seqüência de caracteres "a" antes.O processo de abrir o arquivo, ele irá armazenar em cache o arquivo, beacase i alterar o conteúdo do arquivo, em seguida, ler, o resultado é o mesmo não alterado, então porque truncar arquivo afetará o processo imediatamente? Na programação de sistemas UNIX, ele diz que v nó incluir o tamanho do arquivo atual? Assim, o tamanho don t ser ler a partir do disco toda vez, ele é armazenado em cache na memória.

a fonte de código de processo de leitura.

#include <unistd.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>

int main(int argc, char *argv[])
{
int fd = open("a.txt", O_RDONLY);
char buf[1024];
int n;
for(int i = 0;i < 10; i++){
if (lseek(fd, 0, 0) == -1){
return 1;
}
n = read(fd, buf, 1);
if (n < 0){
perror("error");
return 1;
}
printf("%dn", n);
buf[n]=0;
printf("buf %sn", buf);
sleep(2);
}
return 0;
}

a.txt só tem um caractere:

a

Respostas:

2 para resposta № 1

O armazenamento em cache geralmente é destinado a melhorar o desempenho, sem ter outros efeitos detectáveis.

Se o inode foi armazenado em cache pelo processo, como você descreve, as modificações feitas por outro processo podem não ser visíveis por processos que tinham informações armazenadas em cache. Isso seria ruim.

Na realidade, os blocos de disco são armazenados em cache, os inodes sãoEm cache, várias outras estruturas podem ser armazenadas em cache, mas em cada caso há um único cache, no kernel, que todos os processos compartilham, para que todos tenham uma visualização consistente.

Quando um processo trunca o arquivo, o cache na memória é atualizado, armazenando o novo tamanho de arquivo (que eventualmente será gravado no disco, mas provavelmente não imediatamente). Quando o outro processo chama read novamente, o tamanho do arquivo atualizado é lido do cache na memória, não do disco.