面试题答案
一键面试以下是两种适合复用文件描述符的场景及原因:
进程间通信(如管道通信)
- 场景描述:在父子进程通过管道进行通信时,父进程创建管道后,会得到两个文件描述符,一个用于读(
fd[0]
),一个用于写(fd[1]
)。父进程调用fork
创建子进程后,子进程会复制父进程的文件描述符表,从而复用这些文件描述符。子进程可以关闭读端文件描述符(如果它只负责写),父进程可以关闭写端文件描述符(如果它只负责读),然后双方基于剩下的文件描述符进行数据传递。 - 原因:这种复用方式能够高效地在具有亲缘关系的进程间传递数据,利用了文件描述符在进程间共享的特性,无需额外复杂的数据传输机制。同时,通过关闭不需要的文件描述符,能避免误操作,确保数据流向的正确性。
服务器端并发处理多个客户端连接(以TCP服务器为例)
- 场景描述:在基于TCP协议的服务器编程中,服务器通过
socket
函数创建监听套接字,得到一个文件描述符。当有客户端连接时,accept
函数会返回一个新的文件描述符,代表与客户端建立的连接。服务器可以将这个新的文件描述符传递给新的线程或进程进行处理,而监听套接字继续监听新的连接。例如,使用多线程模型时,主线程负责监听并接受连接,每当有新连接到来,主线程将新的文件描述符传递给工作线程,工作线程复用该文件描述符与客户端进行数据交互。 - 原因:通过复用文件描述符,服务器能够以一种简洁的方式处理多个并发连接。每个连接都通过独立的文件描述符进行管理,便于数据的读写操作。同时,基于文件描述符的复用,服务器可以采用成熟的I/O多路复用机制(如
select
、poll
、epoll
),提高对多个连接的管理效率,实现高效的并发处理。