Como o Linux diferencia entre abrir um arquivo no modo de leitura e realmente ler dados dele?

2

Eu criei um arquivo de texto simples e verifiquei seus timestamps usando stat e aqui está a saída:

stat Output before any python script

papagolf@Sierra ~/My Files/My Programs/Learning/Python % stat prac09_timestamp.txt 
  File: prac09_timestamp.txt
  Size: 10          Blocks: 8          IO Block: 4096   regular file
Device: 802h/2050d  Inode: 2485542     Links: 1
Access: (0600/-rw-------)  Uid: ( 1000/papagolf)   Gid: ( 1001/papagolf)
Access: 2017-09-10 11:10:40.979845492 +0530
Modify: 2017-09-10 11:10:40.979845492 +0530
Change: 2017-09-10 11:10:40.979845492 +0530
 Birth: -

Em seguida, executei um script python que simplesmente abre o arquivo no modo de leitura. Eu estava esperando o tempo "Access" carimbo para mudar, mas isso não aconteceu.

Python Script and output of stat after running it

papagolf@Sierra ~/My Files/My Programs/Learning/Python % cat python prac09_timestamp.py 
cat: python: No such file or directory
a = open("prac09_timestamp.txt", "r")
a.close()
papagolf@Sierra ~/My Files/My Programs/Learning/Python % python prac09_timestamp.py 
papagolf@Sierra ~/My Files/My Programs/Learning/Python % stat prac09_timestamp.txt 
  File: prac09_timestamp.txt
  Size: 10          Blocks: 8          IO Block: 4096   regular file
Device: 802h/2050d  Inode: 2485542     Links: 1
Access: (0600/-rw-------)  Uid: ( 1000/papagolf)   Gid: ( 1001/papagolf)
Access: 2017-09-10 11:10:40.979845492 +0530
Modify: 2017-09-10 11:10:40.979845492 +0530
Change: 2017-09-10 11:10:40.979845492 +0530
 Birth: -

Mas quando eu mudo o script para realmente ler os dados, o registro de data e hora mudou. Você pode explicar isso?

New Python Script and output of stat after running it

papagolf@Sierra ~/My Files/My Programs/Learning/Python % cat prac09_timestamp.py 
a = open("prac09_timestamp.txt", "r")
a.readlines()
a.close()
papagolf@Sierra ~/My Files/My Programs/Learning/Python % python prac09_timestamp.py
papagolf@Sierra ~/My Files/My Programs/Learning/Python % stat prac09_timestamp.txt 
  File: prac09_timestamp.txt
  Size: 10          Blocks: 8          IO Block: 4096   regular file
Device: 802h/2050d  Inode: 2485542     Links: 1
Access: (0600/-rw-------)  Uid: ( 1000/papagolf)   Gid: ( 1001/papagolf)
Access: 2017-09-10 11:13:12.699848321 +0530
Modify: 2017-09-10 11:10:40.979845492 +0530
Change: 2017-09-10 11:10:40.979845492 +0530
 Birth: -
    
por 7_R3X 10.09.2017 / 07:47

1 resposta

5

Eu não acho que essa seja uma pergunta do Python. É o nível do sistema. E nesse nível, abrir um arquivo é uma operação totalmente distinta da leitura de um arquivo. Eu não sou um especialista em qualquer extensão da imaginação em internos do Linux, mas aqui estão alguns fatos básicos:

  • Um arquivo é aberto com a chamada de sistema aberta (2).
  • Um arquivo é lido com a chamada do sistema read (2)
  • Existe um sinalizador para open (2) que instrui o sistema a não atualizar o horário de acesso quando read (2) é chamado. Chama-se O_NOATIME
  • Você pode inferir a partir disso que open (2) não atualiza o tempo de acesso

Se você pensar sobre o que a palavra acesso significa, isso faz sentido. open (2) retorna um descritor de arquivo que pode ser usado subseqüentemente para ler o arquivo. Para usar uma analogia grosseira, é como ter um passe de acesso total para um concerto. Até que você apareça e comece a bater em groupies no backstage você não acessou nada. ;)

    
por 10.09.2017 / 09:03