近期重点要巩固的几个知识点,标准输入输出,文件打开关闭,socket与epoll相关

本文探讨了在使用Python的subprocess模块调用C++程序时遇到的问题,特别是当C++程序的标准输出未能及时读取时导致的程序阻塞现象。通过此案例强调了基础知识的重要性,并分享了解决此类问题的经验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有感于最近开发中遇到的基础性问题,在很多基础问题上犯错,感觉很不应该。基础不牢,地动山摇。

比如python通过subprocess调用一个cpp程序,竟然由于cpp程序的标准输出没有及时读出,导致程序卡住,这个问题我竟然没有意识到,需要弄明白这些东西

### 关系应用 在Linux网络编程中,`socket`用于创建网络连接并传输数据,而`epoll`是一种高效的I/O多路复用机制,专门用来管理多个`socket`文件描述符的状态变化。通过结合两者,可以在高并发场景下实现高性能的服务器程序。 对于`socket`而言,在建立TCP/IP通信时会返回一个表示该连接的文件描述符;而在使用过程中可能涉及读写操作、监听新连接请求等多种行为[^1]。当面临众多活跃连接时,传统方法如轮询检查每个套接字状态变得低效且资源消耗大。 相比之下,`epoll`提供了一种更优的方式去监控这些大量的文件描述符是否有待处理的数据或事件发生(比如可读、可写)。它允许应用程序注册感兴趣的事件,并仅当有特定活动触发时才通知进程,从而大大减少了不必要的系统调用开销和CPU占用率[^2]。 具体来说: - `epoll_create()` 创建一个新的epoll实例; - 使用`epoll_ctl()`向此实例添加/修改/删除要监视的目标fd及其对应的关心事件类型; - 调用`epoll_wait()`阻塞等待直到至少有一个已注册过的fd准备好了指定的操作条件为止,之后返回这批就绪项供后续逻辑处理[^3]。 ```c #include <sys/epoll.h> #define MAX_EVENTS 10 // 创建epoll句柄 int epfd = epoll_create(1); struct epoll_event ev, events[MAX_EVENTS]; ev.events = EPOLLIN | EPOLLET; // 设置为边缘触发模式下的输入事件监测 ev.data.fd = sockfd; // 将sockfd加入到epoll监听列表里 epoll_ctl(epfd, EPOLL_CTL_ADD, sockfd, &ev); while (true) { int n_fds = epoll_wait(epfd, events, MAX_EVENTS, -1); // 阻塞等待直至某些fd准备好 for(int i=0;i<n_fds;++i){ if(events[i].events&EPOLLIN){ /* 处理读取 */ } else if(events[i].events&EPOLLOUT){ /* 处理发送 */} } } ``` 上述代码片段展示了如何初始化一个epoll对象并将某个socket关联至其上进行监听,接着进入无限循环不断查询当前有哪些被关注的对象发生了预期之外的变化以便及时响应它们的需求。 ### 区别 主要体现在功能定位方面:前者负责定义具体的通讯协议栈层面的行为准则以及消息传递路径的选择等问题;后者则是针对操作系统内核所提供的API接口之一,专注于提高异步IO效率特别是面向海量短生命周期链接的服务端架构设计之中[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值