赞
踩
最近有个记笔记的习惯,很好~
通配地址 INADDR_ANY 捆绑通配地址是在告知系统:要是系统是多宿主机,我们将接受目的地址为任何本地接口的连接。
POSIX保证被捕获的信号在其信号处理函数运行期间总是阻塞的。
SIGALRM通常是为I/O操作设置超时,这种情况下我们希望受阻塞的系统调用被该信号中断掉。
POSIX系统的信号处理总结为:(这部分在unix环境高级编程中记得有讲过,可是忘了好多。。)
1.一旦安装了信号处理函数,就一直安装着
2.一个信号处理函数运行期间,正被递交的信号是阻塞的。将sa_mask置为空集,意味着除了被捕获的信号外,没有额外信号被阻塞。
3.如果一个信号在被阻塞期间产生了一次或者多次,那么该信号被接阻塞之后通常只递交一次,也就是说unix信号默认是不排队的。
unix系统在ps命令输出的COMMAND栏以<defunct>指明僵死进程。
在信号处理函数中调用诸如printf这样的标准I/O是不合适的(printf是不可重入的,见269页)
处理僵死进程的可移植方法就是捕获SIGCHLD,并调用wait或waitpid(果断后者)
适用于慢调用系统的基本规则是:当阻塞于某个慢系统调用的一个进程捕获某个信号且相应信号处理函数返回时,该系统调用可能返回一个EINTR错误。有些内核自动重启某些被中断的系统调用。必须对EINTR有所准备。
对于accept以及诸如read,write,select和open之类的函数,是可以重新调用的。对connect就不能自动重启,原因是因为connect可能已经连接一半了,这是个双方过程。应该用select来等待连接完成。
waitpid的options参数允许我们指定附加选项。最常用的选项是WNOHANG,它告知内核在没有已终止子进程时不要阻塞。
源自伯克利的实现完全在内核中处理了中止的连接。POSIX指出连接accept返回前连接中止返回的error值必须是ECONNABORTED(软件引起的连接中止)。服务器可以忽略它,再次调用accept就行。
用select或者poll这两个函数,一旦杀死服务器子进程,客户就会立即被告知已收到FIN
SIGPIPE,该信号的默认行为是终止进程,必须捕获它以免不情愿地被终止
如果信号出现时需采取特殊措施(可能需在日志文件中登记),那么就必须捕获SIGPIPE。
检测服务器主机的奔溃,应用SO_KEEPALIVE套接字选项
SIGTERM信号的默认处置就是终止进程
如果服务器在一个多宿主机上绑定通配IP地址,那么它可以通过调用getsockname确定本地IP地址,用getpeername来确定客户的IP地址和端口号
解决数据格式的2种方法
1.把所有的数值数据作为文本串来传递
2.显式定义所支持数据类型的二进制格式(位数,大端,小端字序)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。