拓展一:文件描述符

一、基本概念

文件描述符(File Descriptor,FD)是一个计算机科学中的概念,表示对文件、网络连接或其他输入输出资源的抽象引用。文件描述符通常是一个非负整数,由操作系统内核分配,用于标识打开的文件或网络连接。

在 Unix 和类 Unix 操作系统中,文件描述符是常见的 I/O 操作方式。标准文件描述符包括:

0: 标准输入(stdin)
1: 标准输出(stdout)
2: 标准错误(stderr)

二、文件描述符的使用

在 Python 中,文件描述符可以通过标准库中的 os 模块来管理和使用。以下是一些常见的操作:

1、打开文件并获取文件描述符

import os

# 打开文件并获取文件描述符
fd = os.open('example.txt', os.O_RDWR | os.O_CREAT)

# 使用文件描述符进行写操作
os.write(fd, b'Hello, world!')

# 关闭文件描述符
os.close(fd)

2、文件描述符与 socket

在网络编程中,socket 也是通过文件描述符来表示的。以下是一个简单的服务器和客户端示例,展示如何使用文件描述符与 socket 进行通信。

服务器示例

import socket
import os

# 创建服务器 socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind(('', 12345))
server_socket.listen(5)
print('Server started on port 12345')

while True:
    client_socket, client_addr = server_socket.accept()
    print(f'Connected by {client_addr}')
    
    # 获取客户端 socket 的文件描述符
    fd = client_socket.fileno()
    print(f'File descriptor for client socket: {fd}')
    
    # 使用文件描述符进行通信
    os.write(fd, b'Successful Connection!\n')
    
    data = os.read(fd, 1024)
    if data:
        print(f'Received: {data.decode("utf-8")}')
        os.write(fd, b'Hello from server!\n')
    
    client_socket.close()

客户端示例

import socket
import os

# 创建客户端 socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 12345))

# 获取客户端 socket 的文件描述符
fd = client_socket.fileno()
print(f'File descriptor for client socket: {fd}')

# 发送数据
os.write(fd, b'Hello World\n')

# 接收数据
data = os.read(fd, 1024)
print(f'Received: {data.decode("utf-8")}')

client_socket.close()

三、文件描述符在 Python 中的高级使用

在 Python 中,可以使用 socket.fromfd() 函数通过文件描述符创建一个新的 socket 对象。这在需要将现有文件描述符转换为 socket 对象时非常有用。

1、通过文件描述符创建 socket 对象

import socket
import os

# 创建服务器 socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind(('', 12345))
server_socket.listen(5)
print('Server started on port 12345')

while True:
    client_socket, client_addr = server_socket.accept()
    print(f'Connected by {client_addr}')
    
    # 获取客户端 socket 的文件描述符
    fd = client_socket.fileno()
    print(f'File descriptor for client socket: {fd}')
    
    # 关闭原始客户端 socket
    client_socket.close()
    
    # 通过文件描述符创建新的 socket 对象
    new_client_socket = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
    
    # 使用新的 socket 对象进行通信
    new_client_socket.send(b'Successful Connection!\n')
    data = new_client_socket.recv(1024)
    if data:
        print(f'Received: {data.decode("utf-8")}')
        new_client_socket.send(b'Hello from server!\n')
    
    new_client_socket.close()

四、总结

文件描述符是用于表示文件、网络连接等 I/O 资源的抽象引用。通过文件描述符,程序可以高效地进行各种 I/O 操作。理解文件描述符的概念和使用方法,对于编写高效的网络程序和系统程序是非常重要的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会飞的小熊~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值