Linux 如何区分以读取模式打开文件和实际从中读取数据?

Linux 如何区分以读取模式打开文件和实际从中读取数据?

我创建了一个简单的文本文件并使用检查其时间戳stat,以下是输出:

stat 在任何 python 脚本之前输出

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: -

然后我运行了一个 python 脚本,它只是以读取模式打开文件。我原以为“访问”时间标记会改变,但事实并非如此。

Python 脚本和运行后 stat 的输出

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: -

但是当我更改脚本以实际读取数据时,时间戳发生了变化。你能解释一下吗?

新的 Python 脚本和运行后 stat 的输出

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: -

答案1

我认为这根本不是一个Python问题。这是系统级别的。在这个级别上,打开文件与读取文件是完全不同的操作。我并不是 Linux 内部结构方面的专家,但这里有一些基本事实:

  • 文件用以下命令打开open()系统调用。
  • 读取文件时使用read()系统调用
  • 有一个标志open()指示系统不更新访问时间什么时候read()被调用。它被称为O_NOATIME
  • 您可以由此推断open()本身不会更新访问时间

如果你想什么使用权意味着这是有道理的。open()仅返回一个文件描述符,该描述符允许您稍后对关联文件执行某些操作(读取和/或写入)。用一个粗略的比喻来说,这就像拥有一张音乐会门票。在你出现并开始摇滚之前,你实际上还没有访问过任何东西。 ;)

相关内容