博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Notes on UNPv1 Ch.5
阅读量:4677 次
发布时间:2019-06-09

本文共 2130 字,大约阅读时间需要 7 分钟。

#1 一般的私有服务器绑定端口时应该应该使用5001~49151区间内的端口. 0~1023为熟知端口, 1024~5000为传统BSD程序使用的临时端口, 49141~65535为一般系统分配时使用的临时端口. (Page.122)

#2 子进程在结束时会向父进程发送信号SIGCHLD, 父进程应使用wait*等函数来获取子进程的终止状态信息, 否则子进程会变成僵尸(APUE有介绍...忘记了). (Page.129)

#3 理所当然的, 信号既可以由内核产生(如SIGCHLD等等信号对应不同的情况), 也可以有进程产生(kill函数). (Page.129)

#4 一般来说大部分信号都可以通过sigaction函数设定一个指定的handler(可以用SIG_DEF重置, SIG_IGN设为忽略: 信号来了就像没来一样, "slow system call"不会被中断)来捕获. 但是SIGIO, SIGPOLLSIGURG仍然需要额外的操作来捕获这些信号. 而SIGKILLSIGSTOP不能被忽略(貌似连捕获都不能?). (Page.129)

#5 signal函数一般会重启被中断的"slow system call"(利用SA_RESTART, 但是有些系统调用绝大部分系统都不会重启, 如select), 但是由SIGALRM引起的中断不会被重启. (Page.130, 134)

#6 可以设置mask来阻止信号的到来, 但是被阻止的信号不是被删除, 而是被保存起来, 等到mask解除之后, 信号仍然会发送到进程中. 如果有多个相同的信号SIGXXX发送到一个设置了mask的进程, 那么只会保留这个信号SIGXXX的一个副本, 也就是说, 解除mask后进程只会收到一个SIGXXX. (Page.131)

#7 捕获一个信号进入信号处理函数, 在处理过程中如果又来了一个相同的信号, 那么这个新的信号会被阻塞(如先后两个子进程结束, 那么就先后发送两个SIGCHLD). 可以设置成不阻塞(SA_NODEFER). (Page.131)

#8 僵尸状态的目的是为父进程维护子进程的终止信息: 进程号, 终止状态, 资源使用情况(CPU time, 内存等). (Page.132)

#9 "slow system call"是指那些可能会一直阻塞的系统调用(如accept, 对socket或pipe的readwrite等等). 对磁盘的读写虽然可能会暂时的阻塞, 但是磁盘IO不是"slow system call". "slow system call"在阻塞是如果进程捕捉到信号并用处理函数处理, 那么"slow system call"可能会返回EINTR(如果被重启了就不会这样). (Page.134)

#10 connect不能重启, 如果connect返回EINTR, 那么应该用select之类的函数等待TCP三次握手完成. 如果是其他错误, 那么就只能close这个sockfd, 重新socket和再次connect. (Page.135)

#11 wait函数用于并行TCP服务器处理结束的子进程不可行, 因为wait不可以在非阻塞模式下工作. 如果多个子进程同时结束, 会出现#6中提到的只有一个SIGCHLD被保留的情况. 所以每次收到SIGCHLD, 应该以循环的方式把当前所有结束了的子进程的信息全部用非阻塞waitpid获取完. (Page.139)

#12 对收到RST的链接accept, errno = ECONNABORTED; write, errno = EPIPE; read, errno = ECONNREST. (Page.140, 142, 144)

#13 一方收到FIN后, 仍然可以向对方发送数据, 但是可能会收到RST. 如果对方使用shutdown来关闭发送(SHUT_WR), 那么本机可以继续发送而不收到RST; 但是如果对方通过close来关闭socket(发送FIN), 或者shutdown+SHUT_RD(这样不会发送FIN), 这种情况下继续发送数据就会收到RST, 如果closeshutdown+SHUT_RD时, 机子还有数据在缓存没有取出, 一样发送RST. (Page.141)

#14 对接收到RST的socket继续进行写操作的话, 会引发SIGPIPE, 无论是否捕捉这个信号, 写操作都会失败, errno=EPIPE. 对收到FIN的socket可以写, 但是对收到RST的socket不可以写. (Page. 143)

#15 一般通过心跳包(主动发送数据确定对方)或SO_KEEPALIVE(一定时间内没有数据交互关闭链接)来确定对方是否崩溃. (Page.145)

#16 使用结构体作为数据发送存在3个问题: 字节排序问题, 类型实现问题, 结构题对齐问题. (Page.150)

转载于:https://www.cnblogs.com/cenhao/archive/2011/08/07/2130133.html

你可能感兴趣的文章
JS学习文章
查看>>
window系统服务器,远程连接mysql数据库。
查看>>
CAS总结之Ticket篇
查看>>
Python2.7升级至Python3.6
查看>>
框架集
查看>>
003
查看>>
HDU 2923 Einbahnstrasse (最短路,3级)
查看>>
实验吧-密码学-我喜欢培根
查看>>
java set集合与List集合练习
查看>>
简短总结一下C#里跨线程更新UI
查看>>
DevExpress下拉多选框 CheckComboboxEdit、CheckedListBoxControl
查看>>
MySQL 忘记Root密码
查看>>
WPF后台自定义文字带背景的选择状态按钮
查看>>
【转自Mgen】 .NET(C#):谈谈各种结束进程的方法
查看>>
用原生javascript做的一个打地鼠的小游戏
查看>>
小米手机 - Charles无法安装证书 因为无法读取证书
查看>>
android 动态壁纸开发
查看>>
你误解了Windows的文件后缀名吗?
查看>>
谷歌浏览器插件
查看>>
Django DEBUG=False
查看>>