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, SIGPOLL和SIGURG仍然需要额外的操作来捕获这些信号. 而SIGKILL和SIGSTOP不能被忽略(貌似连捕获都不能?). (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的read和write等等). 对磁盘的读写虽然可能会暂时的阻塞, 但是磁盘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, 如果close或shutdown+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
Notes on UNPv1 Ch.5相关推荐
- python 堆叠柱状图 多列 复杂_[Python Study Notes]堆叠柱状图绘制
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ...
- C_str的入门级notes
嗯,受人所托,顺便整理的 英文渣 侵删. // 注释的部分是解说(废话)和不怎么重(kǎo)要(chá)的 错误请指正 #include <stdio.h> #include <st ...
- getchar()函数的返回值赋给char型,用if(ch=getchar() != EOF)测试,输入ctrl+z同样可以结束循环的分析...
2013-07-18 21:35:58 getchar()函数的返回值赋给char型,用if(ch=getchar() != EOF)测试,输入ctrl+z同样可以结束循环的分析. char是字符型数 ...
- 【 Notes 】ML ALGORITHMS of TOA - Based Positioning
这篇博文和NLS方法博文行文思路类似:[ Notes ]NLS ALGORITHMS of TOA - Based Positioning ML方法是NLS方法的一个推广版本,具体接着看: Assum ...
- Scipy Lecture Notes学习笔记(一)Getting started with Python for science 1.2. The Python language
Scipy Lecture Notes学习笔记(一)Getting started with Python for science 1.2. The Python language 1.2.2. 基本 ...
- 在Notes客户端如何打开隐藏视图
问题描述: 在Domino 数据库中, 数据库设计者可以将视图设置为隐藏视图, 当视图被设置为隐藏视图后, 用户在打开数据库时无法看到这一视图. 那么, 用户是否可以在Notes 客户端中打开隐藏视图 ...
- Notes客户端重新配置批处理
把以下代码拷贝到记事本,并保持为:Notes客户端初始化设置.bat 格式 @echo off cd "d:\lotus\notes\data" del desktop6.ndk ...
- 再读UNPv1:复习、实践、小结
前言: 这算是第二次系统地阅读UNPv1,正如副标题,不希望写成书摘.缩写版,尽量多写写个人体会和获得的经验,因此很多地方都会从全书的角度来说明,而不仅仅限于某个章节内部. SCTP.信号驱动I/O. ...
- boost learn notes
<?xml version="1.0" encoding="utf-8"?> boost learn notes boost learn notes ...
最新文章
- kettle spoon中“表输入”到“表输出”的乱码问题
- const 的学习(转载)
- android 第三方登录界面,Android App集成第三方登录与换肤指南
- 在网页中嵌入flash之标签
- 微信小程序UI组件、开发框架、实用库...
- linux检查防火墙是否阻挡端口,浅析linux查看防火墙状态和对外开放的端口状态...
- Python全栈开发之11、进程和线程
- 软硬交互代码示例_matlab交互式程序设计示例:[6]GUI界面编程1
- 2018年11月27日 分类与集合
- C++ Liberary websit
- 学习记录 | ZigBee协议栈实践——串口收发数据
- 常见sql注入语句和xss注入语句
- 电脑本地连接,电脑出现多个“本地连接”的解决方法
- PHP加密解密方法 阿星小栈
- flink报错:The types of the interface org.apache.flink.util.OutputTag could not be inferred.
- USB PD 等多协议快充方案
- 计算机报税流程,河南地税电子税务局电脑版纳税申报操作流程(图文)
- Java可以应用到哪些领域?
- “上升”华为碰撞“下降”联想
- 如何给未签收物流备注信息
热门文章
- 比量iOS6/iOS7, 3.5inch/4.0inch
- 网宿科技:向云服务商转型
- js基础——cssText
- Apache Rewrite实现URL的跳转和域名跳转
- oracle 数据库由Linux平台向Windows平台迁移
- 2020 RocketMQ安装
- lnmp改php版本,lnmp安装多版本PHP共存的方法详解
- smarty缓存文件里是php,php-smarty模版引擎中的缓存应用
- c++ java setobjectarrayelement_java中jni的使用:C/C++操作java中的数组
- linux必须运行在enforcing,设置 Selinux环境为 Enforcing模式