fileno詳解:從簡單到匿名

一、fileno簡介

fileno是Python中一個比較基礎的函數,用於返迴文件描述符。文件描述符是在內核中用於標識一個特定的文件的整數值,通常與UNIX系統相關聯。在UNIX系統中,每個進程都有一個文件描述符表,用於管理文件、網路套接字和其他輸入/輸出資源。使用fileno函數可以獲取文件描述符,進而進行文件讀寫等操作。

二、fileno的用法

在Python中,fileno函數可以應用於三種類型的對象:文件、套接字和管道。下面分別介紹一下三種情況下如何使用fileno函數。

1.文件操作

在文件操作中,我們通常需要先打開一個文件對象,然後才能進行文件讀寫等操作。fileno函數可用於獲取文件對象的文件描述符。其代碼示例如下:

f = open('example.txt', 'r')
fd = f.fileno()
print(fd)

代碼執行結果將返迴文件對象的文件描述符。

2.網路套接字

在網路編程中,我們經常需要使用套接字進行數據傳輸。fileno函數也可用於獲取套接字的文件描述符。其代碼示例如下:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('localhost', 8888))
s.listen(1)
fd = s.fileno()
print(fd)

代碼執行結果將返回套接字對象的文件描述符。

3.管道

在進程間通信中,我們可以使用管道(pipe)進行數據傳輸。fileno函數也可用於獲取管道的文件描述符。其代碼示例如下:

import os
r, w = os.pipe()
reader_fd = os.fdopen(r)
writer_fd = os.fdopen(w)
print(reader_fd.fileno(), writer_fd.fileno())

代碼執行結果將返回管道的兩個文件描述符。

三、fileno函數的進階用法:簡單到匿名

除了上述三種基本情況,fileno函數還有一些進階用法。本部分將介紹fileno的另外三種情況:匿名管道、匿名和非阻塞I/O。

1.匿名管道

在UNIX系統中,管道(pipe)是一種可用於協調進程間通信的IPC機制。UNIX管道分為有名管道和匿名管道,其中匿名管道不指向文件系統中的任何文件,而是只在進程間傳遞數據。在Python中,我們可以使用os模塊中的pipe函數創建一個匿名管道,並使用fileno函數獲取其文件描述符,實現進程間通信。其代碼示例如下:

import os
r, w = os.pipe()
pid = os.fork()
if pid:
    os.close(w)
    r = os.fdopen(r)
    print('Parent got:', r.readline())
else:
    os.close(r)
    w = os.fdopen(w, 'w')
    print('child sending')
    w.write('hello parent\n')
    w.close()

代碼執行結果將在父進程列印”Parent got: hello parent”,在子進程列印”child sending”。

2.匿名

我們可以利用fileno函數以及ctypes模塊中的memmove函數,來實現Python中的匿名內存映射。其代碼示例如下:

import mmap
import ctypes
import os

m = mmap.mmap(-1,4096, mmap.MAP_ANONYMOUS | mmap.MAP_PRIVATE)
m.write(b'hello')
os.dup2(ctypes.c_int(m.fileno()).value,0)
os.system('cat')

代碼執行結果將在命令行列印”hello”。

3.非阻塞I/O

在進行I/O操作時,如果程序一直等待I/O操作完成之後才能繼續執行,就會產生阻塞。為了避免阻塞,並且不影響程序的執行,可以使用非阻塞的I/O。Python的select函數是用於多路復用的一個函數,我們可以使用fileno函數將文件描述符與select函數結合起來,實現非阻塞的I/O操作。其代碼示例如下:

import select
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('localhost', 8888))
s.listen(1)
fd = s.fileno()
rlist = [s]
wlist = []
while True:
    readable, writable, exceptional = select.select(rlist, wlist, rlist)
    for s in readable:
        if s is r:
            conn, addr = s.accept()
            rlist.append(conn)
        else:
            data = s.recv(1024)
            if data == b'':
                rlist.remove(s)
            else:
                wlist.append(s)
    for s in writable:
        s.send(b'hello')
        wlist.remove(s)

代碼執行結果將在控制台輸出”hello”。

原創文章,作者:BICZ,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/138128.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
BICZ的頭像BICZ
上一篇 2024-10-04 00:18
下一篇 2024-10-04 00:18

相關推薦

  • Python簡單數學計算

    本文將從多個方面介紹Python的簡單數學計算,包括基礎運算符、函數、庫以及實際應用場景。 一、基礎運算符 Python提供了基礎的算術運算符,包括加(+)、減(-)、乘(*)、除…

    編程 2025-04-29
  • Python滿天星代碼:讓編程變得更加簡單

    本文將從多個方面詳細闡述Python滿天星代碼,為大家介紹它的優點以及如何在編程中使用。無論是剛剛接觸編程還是資深程序員,都能從中獲得一定的收穫。 一、簡介 Python滿天星代碼…

    編程 2025-04-29
  • Python海龜代碼簡單畫圖

    本文將介紹如何使用Python的海龜庫進行簡單畫圖,並提供相關示例代碼。 一、基礎用法 使用Python的海龜庫,我們可以控制一個小海龜在窗口中移動,並利用它的「畫筆」在窗口中繪製…

    編程 2025-04-29
  • Python櫻花樹代碼簡單

    本文將對Python櫻花樹代碼進行詳細的闡述和講解,幫助讀者更好地理解該代碼的實現方法。 一、簡介 櫻花樹是一種圖形效果,它的實現方法比較簡單。Python中可以通過turtle這…

    編程 2025-04-28
  • Python大神作品:讓編程變得更加簡單

    Python作為一種高級的解釋性編程語言,一直被廣泛地運用於各個領域,從Web開發、遊戲開發到人工智慧,Python都扮演著重要的角色。Python的代碼簡潔明了,易於閱讀和維護,…

    編程 2025-04-28
  • 用Python實現簡單爬蟲程序

    在當今時代,互聯網上的信息量是爆炸式增長的,其中很多信息可以被利用。對於數據分析、數據挖掘或者其他一些需要大量數據的任務,我們可以使用爬蟲技術從各個網站獲取需要的信息。而Pytho…

    編程 2025-04-28
  • 如何製作一個簡單的換裝遊戲

    本文將從以下幾個方面,為大家介紹如何製作一個簡單的換裝遊戲: 1. 遊戲需求和界面設計 2. 使用HTML、CSS和JavaScript開發遊戲 3. 實現遊戲的基本功能:拖拽交互…

    編程 2025-04-27
  • Guava Limiter——限流器的簡單易用

    本文將從多個維度對Guava Limiter進行詳細闡述,介紹其定義、使用方法、工作原理和案例應用等方面,並給出完整的代碼示例,希望能夠幫助讀者更好地了解和使用該庫。 一、定義 G…

    編程 2025-04-27
  • 2的32次方-1:一個看似簡單卻又複雜的數字

    對於計算機領域的人來說,2的32次方-1(也就是十進位下的4294967295)這個數字並不陌生。它經常被用來表示IPv4地址或者無符號32位整數的最大值。但實際上,這個數字卻包含…

    編程 2025-04-27
  • 製作一個簡單的管理系統的成本及實現

    想要製作一個簡單的管理系統,需要進行技術選型、開發、測試等過程,那麼這個過程會花費多少錢呢?我們將從多個方面來闡述製作一個簡單的管理系統的成本及實現。 一、技術選型 當我們開始思考…

    編程 2025-04-27

發表回復

登錄後才能評論