Python: file object กับ file descriptor

พอดีมีคนถามที่ codenone (http://www.codenone.com/node/687 ว่า file object ของ Python ต่างจาก file descriptor อย่างไร. ผมพยายามจะตอบจากการไปอ่าน code ของ Python 2.5.1 ก็ได้คำตอบมาแบบนี้.

เราสามารถขอ file descriptor ซึ่งเป็นเลขจำนวนเต็มธรรมดาๆ จาก file object ได้โดยใช้ method ชื่อ fileno() ตามตัวอย่างด้านล่าง

fp = open("foo.txt", "a+")
print fp.fileno()

เลขที่ print ออกมาคือ file descriptor. file object ที่หุ้ม file descriptor (fd; ต่อไปขอย่อว่า fd นะ) ไว้อีกที.จริงๆแล้ว file object ของ python ก็ไม่ได้ไปเก็บ fd ไว้ตรงๆ. แต่เก็บ FILE (ของ libc) ไว้. และใน FILE ก็มี fd อีกที.มันเป็น layer ประมาณนี้ (Python)File object -> FILE (libc) -> File descriptor (unix)

ถ้าเราสั่ง open(“foo.txt”) ใน Python. ข้างในมันก็จะไปเรียก

  1. fopen(“foo.txt”, “r”) ในภาษาซีให้อีก.
  2. แล้วใน fopen ก็ไปเรียก open(“foo.txt”, flags, mode); ของ unix อีกที (มั้ง ไม่ได้ check code ดู แค่เดาๆ เอา).
  3. แล้ว open ของ unix นี่หละ return fd ออกมา.
  4. พอ fopen ได้ fd มาก็จะเอาไปเก็บไว้ แล้ว return file pointer (FILE *) ออกมา ซึ่งข้างในเก็บ fd ไว้.
  5. open ของ Python ก็ return file object ที่เก็บ file pointer (FILE *) ไว้อีกที.

ผมดูแต่ code ของ Python. ไม่ได้ดูใน code ของ libc เท่าไหร่ อาจจะมีที่ผิดๆมั่วอยู่ได้ อย่างไรก็ตามก็น่าจะพอทำให้เข้าใจคร่าวๆ

ป.ล. สำหรับท่าใส่ source code ใน wordpress เอามาจาก http://wuhrr.wordpress.com/2007/11/09/colorize-your-code-for-free-online/ ขอบใจหลายๆ. ต้อง credit Google ด้วยมั้ง เพราะไม่มี google ก็คงหาไม่เจอ แต่ถ้าไม่มี Internet ก็ไม่มี Google นะ …. พอก่อนละกัน.

ป.ล. (2) แหมอยากจะทำ animation ให้ดูเลย แต่สงสัยเว่อร์ไป

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s