Linux下Socket编程学习(五)

本章节探讨了产生SIGPIPE信号的原因,包括在已接收FIN的套接字中写入数据的情况以及如何处理SIGPIPE信号。同时,介绍了五种I/O模型:阻塞I/O、非阻塞I/O、I/O复用、信号驱动I/O和异步I/O,详细解释了每种模型的工作原理和适用场景。

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

这章讲下产生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

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

         通知上层程序




          

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值