python3socket非阻塞在linux里无效_linux C socket编程 — 阻塞式与非阻塞式

本文介绍了如何在Linux环境中使用Python3的socket设置非阻塞模式,以及如何利用select函数提高系统资源利用率。通过非阻塞模式的设置,可以避免CPU的忙等待,但可能会导致效率下降。select函数则能够在多个文件描述符中监听活动,仅当有数据准备就绪时唤醒进程,减少了CPU开销。文章详细讲解了select函数的使用,包括参数含义和相关宏的运用。
摘要由CSDN通过智能技术生成

#include ……

sockfd = socket(AF_INET,SOCK_STREAM,0);

fcntl(sockfd,F_SETFL,O_NONBLOCK);

……

通过设置socket为非阻塞方式,可以实现“轮询“若干Socket。当企图从一个没有数据等待处理的非阻塞Socket读入数据时,函数将立即返

回,返回值为-1,并置errno值为EWOULDBLOCK。但是这种“轮询“会使CPU处于忙等待方式,从而降低性能,浪费系统资源。而调用

select()会有效地解决这个问题,它允许你把进程本身挂起来,而同时使系统内核监听所要求的一组文件描述符的任何活动,只要确认在任何被监控的文件

描述符上出现活动,select()调用将返回指示该文件描述符已准备好的信息,从而实现了为进程选出随机的变化,而不必由进程本身对输入进行测试而浪费

CPU开销。Select函数原型为:

int select(int numfds,fd_set *readfds,fd_set *writefds,

fd_set *exceptfds,struct timeval *timeout);

其中readfds、writefds、exceptfds分别是被select()监视的读、写和异常处理的文件描述符集合。如果你希望确定是否可

以从标准输入和某个socket描述符读取数据,你只需要将标准输入的文件描述符0和相应的sockdtfd加入到readfds集合中;numfds的

值是需要检查的号码最高的文件描述符加1,这个例子中numfds的值应为sockfd+1;当select返回时,readfds将被修改,指示某个文

件描述符已经准备被读取,你可以通过FD_ISSSET()来测试。为了实现fd_set中对应的文件描述符的设置、复位和测试,它提供了一组宏:

FD_ZERO(fd_set *set)—-清除一个文件描述符集;

FD_SET(int fd,fd_set *set)—-将一个文件描述符加入文件描述符集中;

FD_CLR(int fd,fd_set *set)—-将一个文件描述符从文件描述符集中清除;

FD_ISSET(int fd,fd_set *set)—-试判断是否文件描述符被置位。

Timeout参数是一个指向struct timeval类型的指针,它可以使select()在等待timeout长时间后没有文件描述符准备好即返回。struct timeval数据结构为:

struct timeval {

int tv_sec; /* seconds */

int tv_usec; /* microseconds */

};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值