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处理。
#include "unp.h" void
sig_chld(int signo)
{
pid_t pid;
int stat; while((pid = waitpid(-, &stat, WHOHANG)) > )
printf("child %d terminated\n", pid);
return;
}
我们在网络编程时可能会遇到的三种情况:
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学习第五章(二)的更多相关文章
- UNP学习第五章
一.概述 想要写一个完整的TCP客户-服务器程序例子,有下面功能的回射服务器 1.客户从标准输入读一行文本,写到服务器上: 2.服务器从网络输入读此行,并回射给客户: 3.客户读此回射行并写到标准输出 ...
- Java基础知识二次学习--第五章 数组
第五章 数组 时间:2017年4月26日15:11:30~2017年4月26日15:15:54 章节:05章_01节 视频长度:09:30 内容:一维数组的内存分析 心得: Java中数组是引用类型 ...
- C#高级编程 (第六版) 学习 第五章:数组
第五章 数组 1,简单数组 声明:int[] myArray; 初始化:myArray = new int[4]; 为数组分配内存. 还可以用如下的方法: int[] myArray = new in ...
- UNP学习第六章(二)
一.描述符就绪条件 对于引起select返回套接字“就绪”的条件我们必须讨论得更明确: (1)满足一下塞个条件中的仍和一个时,一个套接字准备好读. a)该套接字接收缓冲区中的数据字节数不大于等于套接字 ...
- C语言学习第五章
今天要进行一个重要元素数组的学习了.这一章要掌握什么是数组,数组怎么样命名,数组怎么样使用,以及一些常见的错误和需要注意的事项. 一. 数组的基本概念 数组是可以在内存中连续存储多个元素的结 ...
- 深度学习框架PyTorch一书的学习-第五章-常用工具模块
https://github.com/chenyuntc/pytorch-book/blob/v1.0/chapter5-常用工具/chapter5.ipynb 希望大家直接到上面的网址去查看代码,下 ...
- UNP学习第三章
一.主机字节序和网络字节序 转换时用到下列四个函数: #include <netinet/in.h> uint16_t htons(uint16_t host16bitvalue); ui ...
- salesforce 零基础学习(五十二)Trigger使用篇(二)
第十七篇的Trigger用法为通过Handler方式实现Trigger的封装,此种好处是一个Handler对应一个sObject,使本该在Trigger中写的代码分到Handler中,代码更加清晰. ...
- java并发学习第五章--线程中的锁
一.公平锁与非公平锁 线程所谓的公平,就是指的是线程是否按照锁的申请顺序来获取锁,如果是遵守顺序来获取,这就是个公平锁,反之为非公平锁. 非公平锁的优点在于吞吐量大,但是由于其不是遵循申请锁的顺序来获 ...
随机推荐
- UML-六大关系
六大关系 依赖关系:(只要是在类中使用到了对方就存在依赖关系) 泛化关系:就是继承关系,即依赖关系的特例 实现关系:依赖关系的特例 关联关系:类于类之间的关系,即依赖关系的特例(具有导航性:双向关系或 ...
- 配置 Ceph 内外网分离
https://www.jianshu.com/p/42ab1f6dc6de 1. 为什么要做内外网分离 先明确一下这么做的必要性.Ceph 的客户端,如 RADOSGW,RBD 等,会直接和 O ...
- 十条服务器端优化Web性能的技巧
服务器 远程桌面连接工具 提高web应用的性能从来没有比现在更重要过.网络经济的比重一直在增长;全球经济超过5%的价值是在因特网上产生的(数据参见下面的资料).这个时刻在线的超连接世界意味着用户对其 ...
- php str_pad()函数 语法
php str_pad()函数 语法 str_pad()函数怎么用? php str_pad()函数用于把字符串填充到指定长度,语法是str_pad(string,length,pad_string, ...
- cannot access Input/output error
ls: cannot access Input/output errorls: cannot open directory .: Input/output error 硬盘故障,只读或只写,你可以d ...
- MySQL中truncate误操作后的数据恢复案例
MySQL中truncate误操作后的数据恢复案例 这篇文章主要介绍了MySQL中truncate误操作后的数据恢复案例,主要是要从日志中定位到truncate操作的地方然后备份之前丢失的数据,需要的 ...
- centos挂载移动硬盘ntfs-3g
yum install ntfs-3g sudo mount -t ntfs-3g /dev/sdc1 /mnt/mobiledisk https://tuxera.com/opensource/nt ...
- 像这样玩C#【转】,觉得文章写的不错就转来啦!版权不在我
我们玩技术,不是被技术玩.Coding是快乐的,而非苦逼的..Net/C# 这个神器竟然天天有人吐槽.看不下去鸟. 在top10语言中,C#是最优美的语言,没有之一.在top10语言中,C#所可用的标 ...
- Cocos2d之FlyBird开发---简介
| 版权声明:本文为博主原创文章,未经博主允许不得转载. 开发FlyBird其实非常的简单,在游戏的核心部分,我们需要实现的只有: 创建一个物理世界(世界设置重力加速度) 在物理世界中添加一个动态 ...
- python基础--选择排序
1.首先用一张图来描述选择排序的具体过程 2.废话不多说,上代码 # 1.定义函数:选择排序 def choose_sort(list): list_len = len(list) for i in ...