Notes on UNPv1 Ch.5

#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)

posted on 2011-08-07 17:12  Qwertycen  阅读(140)  评论(0编辑  收藏  举报

导航