UNP Chapter 5 - TCP客户-服务器程序例子
5.1. 概述
5.2. TCP echo server程序: main函数
5.3. TCP echo server程序: str_echo函数
5.4. TCP echo client程序: main函数
5.5. TCP echo client程序: str_cli函数
5.6. 正常启动
5.7. 正常终止
5.8. Posix信号处理
每个信号都有一个处理办法(disposition),也称为与此信号关联的行为(action)。我们通过调用函数sigaction来设置一个信号的处理办法。
1.可以提供一个函数,在信号发生时随即调用。这个函数称为信号处理函数(signal handler),而此行为便称为捕获(catching)信号。有两个信号不能捕获SIGKILL和SIGSTOP,函数由信号值这一单一参数来调用且无返回值,函数原型为
void handler(int signo);
信号SIGIO,SIGPOLL,SIGURG还要求捕获它的进程有其它动作。
2. 可以通过设置信号的处理办法为SIG_IGN来忽略它,但是SIGKILL和SIGSTOP不能忽略。
3. 可以设置信号的处理办法为SIG_DFL来为它设置缺省处理办法。
函数signal的函数原型层次复杂
void ( * signal (int signo, void ( * func)(int) ) )(int);
用typedef简化函数原型
typedef void Sigfunc(int); // 它说明信号处理程序是带有一个整形参数且无返回值的函数
这样signal的函数原型就变为
Sigfunc * signal (int signo, Sigfunc * func); // 此函数的第二个参数和返回值都是指向信号处理函数的指针
5.9. 处理SIGCHLD信号
设置僵尸(Zombie)状态的目的就是维护子进程的信息,以便父进程在稍后的某个时候取回。如果一个进程终止,且该进程有子程序处于僵尸状态,则所有僵尸子进程的父进程ID均置为1(init进程),init进程将作为这些子进程的继父,并负责清除他们(也就是说,init进程将wait它们,从而去除僵尸进程),有些Unix系统给僵尸进程输出的COMMAND列为<defunct>(ps命令输出)。
5.10. wait和waitpid函数
#include <sys/wait.h>
pid_t wait(int *statloc); //返回: 进程ID为0成功,-1出错
pid_t waitpid(pid_t pid, int *statloc, int options); //返回: 进程ID为0成功,-1出错
函数wait和waitpid均返回两个值: 函数的返回值是终止子进程的进程ID号,子进程的终止状态(一个整数)则是通过指针statloc返回的。
5.11. accept返回前连接夭折
5.12. 服务器进程终止
5.13. SIGPIPE信号
5.14. 服务器主机崩溃
5.15. 服务器主机崩溃后重启
5.16. 服务器主机关机
5.17. TCP程序例子小结
5.18. 数据格式
5.19. 小结
5.20. 习题