Linuxでは、読み取りモードでファイルを開くことと実際にファイルからデータを読み取ることをどのように区別しますか?

Linuxでは、読み取りモードでファイルを開くことと実際にファイルからデータを読み取ることをどのように区別しますか?

単純なテキストファイルを作成し、以下を使用してタイムスタンプを確認しました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スクリプトと統計出力

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スクリプトと統計の出力

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()後で関連ファイルに対していくつかの操作(読み取りおよび/または書き込み)を実行できるファイル記述子を返します。おおよそのたとえ話を使うと、コンサートチケットを持っているのと同じです。あなたが現れて遊び始めるまで、実際に何も訪れたことはありません。 ;)

関連情報