这章讲下产生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
递送一个应用层的缓冲区,即使没有数据到来也返回,当有数据到来之后,内核就将数据拷贝到应用层缓冲区
通知上层程序