Linux下Socket编程学习(五)

这章讲下产生SIGPIPE信号的原因

往一个已经收到FIN的套接字中写是允许的,接收到FIN仅仅代表对方不再发送数据。

如果对方进程不存在了,你还写数据那么会返回一个RST段RST段之后,如果再调用write就会产生SIGPIPE信号,对于这个信号直接忽略就ok了

singal(SIGPIPE,SIG_IGN);


五种I/O模型

阻塞I/O

非阻塞I/O

I/O复用(select和poll)

信号驱动I/O

异步I/O


阻塞I/O

    recv进行阻塞

     当有数据到来 会从内核空间拷贝到用户空间 recv返回

非阻塞I/O

     recv设置为非阻塞模式(fcntl(fd,F_SETFEL,flag|O_NONBLOCK))

     没有数据返回错误 -1  errono =EWOULDBLOCK

      不停的轮询 直到有数据到来

       应用范围很窄基本不会去用啦

I/O复用(select和poll)

       使用select来实现

        select可以管理多个文件描述符,一旦有一个或多个有数据到来就可以返回

        在select中阻塞

信号驱动I/O

         基本上不用 用户空间建立SIGIO信号。当有数据到来时就以信号的方式通知程序

异步I/O

         递送一个应用层的缓冲区,即使没有数据到来也返回,当有数据到来之后,内核就将数据拷贝到应用层缓冲区

         通知上层程序




          

你可能感兴趣的:(Linux下Socket编程学习(五))