वीर

17 กุมภาพันธ์ 2008

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 ให้ดูเลย แต่สงสัยเว่อร์ไป

No Comments Yet »

ยังไม่มีความคิดเห็นใดๆ

RSS feed สำหรับความคิดเห็นในกระทู้นี้ TrackBack URI

เขียนความคิดเห็นของคุณ

บลอกที่ WordPress.com .