Linux高性能服务器编程(四)

9. I/O复用

I/O复用:使得程序能同时监听多个文件描述符

9.1 文件描述符(事件)就绪

  • 可读:
  1. socket内核接受缓冲区有数据
  2. 对方关闭连接
  3. 监听的socket上有新的连接请求
  4. socket上有未处理的错误
  • 可写:
  1. socket内核发送缓冲区有数据
  2. socket写操作被关闭,对socket执行写操作,触发SIGPIPE信号
  3. socket使用非阻塞connect连接成功或失败(超时)之后
  4. socket上有未处理对错误
  • 异常:
    socket上接受到带外数据(紧急数据)

9.2 ET、LT

LT
在这里插入图片描述

ET
在这里插入图片描述

9.3 select、poll、epoll区别

在这里插入图片描述

10. 信号

10.1 信号产生

  • 用户输入(ctrl+c)
  • 系统异常(非法访问内存)
  • 系统状态变化(alarm定时器)
  • kill命令(函数)

10.2 发送信号

int kill(pid_t pid, int sig);

若sig==0,kill函数不发送任何信号。可以用来检测目标进程或进程组是否存在,因为检测工作总是在信号发送之前就执行。不过这种检测方式不可靠,一方面由于进程pid回绕,可能导致被检测的pid不是我们期待的进程,另一方面,这种检测不是原子操作。

10.3 信号默认处理方式:SIG_DFL

  • 结束进程
  • 忽略信号:SIG_IGN
  • 结束进程并生成核心转储文件
  • 暂停进程
  • 继续进程

10.4 标准信号

SIGHUP:控制终端挂起
SIGPIPE:往读终端被关闭的管道或者socket连接中写数据
SIGCHLD:子进程状态发生变化(退出、暂停)
SIGURG:socket连接上接受到紧急数据

在这里插入图片描述
在这里插入图片描述

  • 在多进程、多线程环境中,要以进程、线程为单位来处理信号和阻塞信号集。不能设想新创建的进程、线程具有和父进程、主线程完全相同的信号特征。如:fork调用产生的子进程将继承父进程的阻塞信号集,但具有一个空的未决信号集。

10.5 signal、sigaction

sighandler_t signal(int signum, sighandler_t handler);
int sigaction(int signum, const struct sigaction *act,
              struct sigaction *oldact);

在这里插入图片描述

信号掩码指定哪些信号不能发送给本进程

10.6 统一事件源

在这里插入图片描述

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值