UNP学习第五章
Posted 思而不学
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UNP学习第五章相关的知识,希望对你有一定的参考价值。
一、POSIX信号处理
信号:告知某进程发生了某个事件的通知(软中断),通常是异步的。
信号可以:由进程发给另一个进程,由内核发给某个进程。
设置信号处理办法,有三个选择:
1.写一个函数,在信号发生时立即调用。不过SIGKILL和SIGSTOP不能被捕获。
有些信号如SIGIO、SIGPOLL和SIGURG。
2.设置信号处理办法为SIG_IGN来忽略,SIGKILL和SIGSTOP不能忽略
3.设置信号处理办法为SIG_DFL来设置缺省处理。
#include <signal.h> sighandler_t signal(int signum, sighandler_t handler); 返回值:成功返回以前的信号处理配置,出错返回SIG_ERR
signum:信号名
handler:上面三个的一种,函数名,SIG_IGN或SIG_DFL
对POSIX兼容系统上的信号处理作以下总结:
- 一旦安装了信号处理程序,便一直安装着。
- 当一个信号处理程序正在执行时,所递交的信号是阻塞的。包括在sa_mask中定义的信号。
- 信号在阻塞时生成了多次,解阻塞时只发生一次。
- 用sigprocmask可以选择性的阻塞和不阻塞一组信号
二、处理SIGCHLD信号
当一个进程终止,如果它有子进程处于僵尸状态,则所有僵尸子进程的父进程ID均设置为1。
警告:在信号处理程序中调用诸如printf这样的标准I/O函数是不合适的。
太长了,原谅我看不懂。。。。
三、wait和waitpid函数
#include <sys/wait.h> pid_t wait(int *statloc); pid_t waitpid(pid_t pid, int *statloc, int options); 返回:进程ID0成功,-1出错
statloc:子进程终止状态
options:
当服务器创建子进程处理消息后,子进程结束时。会发送SIG_CHILD信号。此时如果有多个进程同时退出,那么
进程的SIG_CHILD在阻塞时收到,就会只响应一次。
所以需要wait或waipid处理。
1 #include "unp.h" 2 3 void 4 sig_chld(int signo) 5 { 6 pid_t pid; 7 int stat; 8 9 while((pid = waitpid(-1, &stat, WHOHANG)) > 0) 10 printf("child %d terminated\\n", pid); 11 return; 12 }
我们在网络编程时可能会遇到的三种情况:
1.当派生子进程时,必须捕获信号SIGCHLD。
2.当捕获信号时,必须处理被中断的系统调用。
3.SIGCHLD的信号处理程序必须正确编写,应使用函数waitpid以免留下僵尸进程。
四、服务器进程终止
1.在不同主机上启动服务器和客户,并在客户键入一行,若正常。服务器回射
2.找到服务器子进程,并杀死该进程。子进程发送FIN给客户,客户TCP相应的以ACK响应。
3.信号SIGCHLD发往服务器并正确处理。
4.客户TCP从服务器TCP接收FIN并以ACK响应。但客户进程正阻塞在fgets,等待从终端上得到一行。
5.运行netstat观察客户套接口状态
6.再键入一行,
7.看不下去了
8。。。。。。
五、SIGPIPE信号
六、服务器主机崩溃
以上是关于UNP学习第五章的主要内容,如果未能解决你的问题,请参考以下文章