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

7_R*_*R3X 2 python timestamps files

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

任何 python 脚本之前的 stat 输出

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: -
Run Code Online (Sandbox Code Playgroud)

然后我运行了一个 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: -
Run Code Online (Sandbox Code Playgroud)

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

新的 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: -
Run Code Online (Sandbox Code Playgroud)

B L*_*yer 5

我认为这根本不是 Python 问题。是系统级别。在那个级别,打开文件与读取文件是完全不同的操作。我对 Linux 内部的任何想象都不是专家,但这里有一些基本事实:

  • 使用 open(2) 系统调用打开文件。
  • 使用 read(2) 系统调用读取文件
  • open(2) 有一个标志,指示系统在调用 read(2) 时不更新访问时间。它叫做O_NOATIME
  • 由此可以推断 open(2) 不会更新访问时间

如果您考虑“访问”一词的含义,这是有道理的。open(2) 返回一个文件描述符,随后可用于读取文件。用一个粗略的比喻,这就像拥有一场音乐会的全票通行证。直到你出现并开始追捧后台的追星族之前,你还没有访问过任何东西。;)