欧洲杯决赛竞猜平台

阻塞和非阻塞的实现

admin 2021-06-22 19:19 未知

本文转载自微信公众号「编程杂技」,作者theanarkh。转载本文请联系编程杂技公众号。

我们可能都已经听过阻塞非阻塞的概念,本文以tcp中的connect系统调用为例子(基于1.12.13内核,新版的原理类似,但是过程就很复杂了,有时间再分析),分析阻塞和非阻塞是什么并且看他是如何实现的。话不多说,直接开始。

static int inet_connect(struct socket *sock, struct sockaddr * uaddr,       int addr_len, int flags) {   struct sock *sk=(struct sock *)sock->data;   // 调用底层的连接函数,发一个syn包   err = sk->prot->connect(sk, (struct sockaddr_in *)uaddr, addr_len);   if (err < 0)      return(err);    // 还没建立连接成功并且是非阻塞的方式,直接返回   if (sk->state != TCP_ESTABLISHED &&(flags & O_NONBLOCK))        return(-EINPROGRESS);   // 早期通过关中断防止竞态情况   cli();    // 连接建立中,阻塞当前进程   while(sk->state == TCP_SYN_SENT 

Powered by 欧洲杯决赛竞猜平台 @2018 RSS地图 HTML地图