文章目录
9. I/O复用
I/O复用:使得程序能同时监听多个文件描述符
9.1 文件描述符(事件)就绪
- 可读:
- socket内核接受缓冲区有数据
- 对方关闭连接
- 监听的socket上有新的连接请求
- socket上有未处理的错误
- 可写:
- socket内核发送缓冲区有数据
- socket写操作被关闭,对socket执行写操作,触发SIGPIPE信号
- socket使用非阻塞connect连接成功或失败(超时)之后
- 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);
信号掩码指定哪些信号不能发送给本进程