Linux signal 编程(转载)
转载地址:http://blog.sina.com.cn/s/blog_4b226b92010119l5.html
当服务器close一个连接时,若client端接着发数据。根据TCP协议的规定,会收到一个RST响应,client再往这个服务器发送数据时,系统会发出一个SIGPIPE信号给进程,告诉进程这个连接已经断开了,不要再写了。根据信号的默认处理规则SIGPIPE信号的默认执行动作是 terminate(终止、退出), 所以client会退出。
若不想客户端退出可以把 SIGPIPE设为SIG_IGN
如:    signal(SIGPIPE,SIG_IGN);
这时SIGPIPE交给了系统处理。
服务器采用了fork的话,要收集垃圾进程,防止僵死进程的产生,可以这样处理:
signal(SIGCHLD,SIG_IGN); 交给系统init去回收。
这里子进程就不会产生僵死进程了。
signal(SIGHUP, SIG_IGN);
signal信号函数,第一个参数表示需要处理的信号值(SIGHUP),第二个参数为处理函数或者是一个表示,这里,SIG_IGN表示忽略SIGHUP那个注册的信号。
SIGHUP和控制台操作有关,当控制台被关闭时系统会向拥有控制台sessionID的所有进程发送HUP信号,默认HUP信号的action是 exit,如果远程登陆启动某个服务进程并在程序运行时关闭连接的话会导致服务进程退出,所以一般服务进程都会用nohup工具启动或写成一个 daemon。
unix中进程组织结构为 session 包含一个前台进程组及一个或多个后台进程组,一个进程组包含多个进程。
一个session可能会有一个session首进程,而一个session首进程可能会有一个控制终端。
一个进程组可能会有一个进程组首进程。进程组首进程的进程ID与该进程组ID相等。
这儿是可能会有,在一定情况之下是没有的。
与终端交互的进程是前台进程,否则便是后台进程
SIGHUP会在以下3种情况下被发送给相应的进程:
1、终端关闭时,该信号被发送到session首进程以及作为job提交的进程(即用 & 符号提交的进程)
2、session首进程退出时,该信号被发送到该session中的前台进程组中的每一个进程
3、若父进程退出导致进程组成为孤儿进程组,且该进程组中有进程处于停止状态(收到SIGSTOP或SIGTSTP信号),该信号会被发送到该进程组中的每一个进程。
系统对SIGHUP信号的默认处理是终止收到该信号的进程。所以若程序中没有捕捉该信号,当收到该信号时,进程就会退出。
表头文件 #include<signal.h>   
功 能:
设置某一信号的对应动作   
函数原型 :
void (*signal(int signum,void(* handler)(int)))(int);   
或者:typedef void(*sig_t) ( int );   sig_t signal(int signum,sig_t handler);   
参数说明:  
第一个参数signum指明了所要处理的信号类型,它可以取除了SIGKILL和SIGSTOP外的任何一种信号。  
第二个参数handler描述了与信号关联的动作,它可以取以下三种值:   
(1)一个返回值为正数的函数地址  此函数必须在signal()被调用前申明,handler中为这个函数的名字。当接收到一个类型为sig的信号时,就执行handler 所指定的函数。这个函数应有如下形式的定义:   intfunc(int sig);   sig是传递给它的唯一参数。执行了signal()调用后,进程只要接收到类型为sig的信号,不管其正在执行程序的哪一部分,就立即执行func()函数。当func()函数执行结束后,控制权返回进程被中断的那一点继续执行。  
(2)SIGIGN   这个符号表示忽略该信号,执行了相应的signal()调用后,进程会忽略类型为sig的信号。   
(3)SIGDFL   这个符号表示恢复系统对信号的默认处理。   
函数说明 :   signal()会依参数signum 指定的信号编号来设置该信号的处理函数。当指定的信号到达时就会跳转到参数handler指定的函数执行。当一个信号的信号处理函数执行时,  如果进程又接收到了该信号,该信号会自动被储存而不会中断信号处理函数的执行,直到信号处理函数执行完毕再重新调用相应的处理函数。但是如果在信号处理函数执行时进程收到了其它类型的信号,该函数的执行就会被中断。  
返回值: 返回先前的信号处理函数指针,如果有错误则返回SIG_ERR(-1)。   
附加说明 :在信号发生跳转到自定的handler处理函数执行后,系统会自动将此处理函数换回原来系统预设的处理方式,如果要改变此操作请改用sigaction()。  
下面的情况可以产生Signal:  
1. 按下CTRL+C产生SIGINT   
2. 硬件中断,如除0,非法内存访问(SIGSEV)等等   
3. Kill函数可以对进程发送Signal   
4. Kill命令。实际上是对Kill函数的一个包装   
5. 软件中断。如当Alarm Clock超时(SIGURG),当Reader中止之后又向管道写数据(SIGPIPE),等等   
 
2 Signals:
| Signal | Description | 
| SIGABRT | 由调用abort函数产生,进程非正常退出 | 
| SIGALRM | 用alarm函数设置的timer超时或setitimer函数设置的interval timer超时 | 
| SIGBUS | 某种特定的硬件异常,通常由内存访问引起 | 
| SIGCANCEL | 由Solaris Thread Library内部使用,通常不会使用 | 
| SIGCHLD | 进程Terminate或Stop的时候,SIGCHLD会发送给它的父进程。缺省情况下该Signal会被忽略 | 
| SIGCONT | 当被stop的进程恢复运行的时候,自动发送 | 
| SIGEMT | 和实现相关的硬件异常 | 
| SIGFPE | 数学相关的异常,如被0除,浮点溢出,等等 | 
| SIGFREEZE | Solaris专用,Hiberate或者Suspended时候发送 | 
| SIGHUP | 发送给具有Terminal的Controlling Process,当terminal被disconnect时候发送 | 
| SIGILL | 非法指令异常 | 
| SIGINFO | BSD signal。由Status Key产生,通常是CTRL+T。发送给所有Foreground Group的进程 | 
| SIGINT | 由Interrupt Key产生,通常是CTRL+C或者DELETE。发送给所有ForeGround Group的进程 | 
| SIGIO | 异步IO事件 | 
| SIGIOT | 实现相关的硬件异常,一般对应SIGABRT | 
| SIGKILL | 无法处理和忽略。中止某个进程 | 
| SIGLWP | 由Solaris Thread Libray内部使用 | 
| SIGPIPE | 在reader中止之后写Pipe的时候发送 | 
| SIGPOLL | 当某个事件发送给Pollable Device的时候发送 | 
| SIGPROF | Setitimer指定的Profiling Interval Timer所产生 | 
| SIGPWR | 和系统相关。和UPS相关。 | 
| SIGQUIT | 输入Quit Key的时候(CTRL+\)发送给所有Foreground Group的进程 | 
| SIGSEGV | 非法内存访问 | 
| SIGSTKFLT | Linux专用,数学协处理器的栈异常 | 
| SIGSTOP | 中止进程。无法处理和忽略。 | 
| SIGSYS | 非法系统调用 | 
| SIGTERM | 请求中止进程,kill命令缺省发送 | 
| SIGTHAW | Solaris专用,从Suspend恢复时候发送 | 
| SIGTRAP | 实现相关的硬件异常。一般是调试异常 | 
| SIGTSTP | Suspend Key,一般是Ctrl+Z。发送给所有Foreground Group的进程 | 
| SIGTTIN | 当Background Group的进程尝试读取Terminal的时候发送 | 
| SIGTTOU | 当Background Group的进程尝试写Terminal的时候发送 | 
| SIGURG | 当out-of-band data接收的时候可能发送 | 
| SIGUSR1 | 用户自定义signal 1 | 
| SIGUSR2 | 用户自定义signal 2 | 
| SIGVTALRM | setitimer函数设置的Virtual Interval Timer超时的时候 | 
| SIGWAITING | Solaris Thread Library内部实现专用 | 
| SIGWINCH | 当Terminal的窗口大小改变的时候,发送给Foreground Group的所有进程 | 
| SIGXCPU | 当CPU时间限制超时的时候 | 
| SIGXFSZ | 进程超过文件大小限制 | 
| SIGXRES | Solaris专用,进程超过资源限制的时候发送 | 
1、不要使用低级的或者STDIO.H的IO函数 2、不要使用对操作 3、不要进行系统调用 4、不是浮点信号的时候不要用longjmp 5、singal函数是由ISO C定义的。因为ISO C不涉及多进程,进程组以及终端I/O等,所以他对信号的定义非常含糊,以至于对UNIX系统而言几乎毫无用处。 备注:因为singal的语义于现实有关,所以最好使用sigaction函数替代本函数。
Linux signal 编程(转载)的更多相关文章
- Linux网络编程入门 (转载)
		(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ... 
- linux基础编程:IO模型:阻塞/非阻塞/IO复用 同步/异步 Select/Epoll/AIO(转载)
		IO概念 Linux的内核将所有外部设备都可以看做一个文件来操作.那么我们对与外部设备的操作都可以看做对文件进行操作.我们对一个文件的读写,都通过调用内核提供的系统调用:内核给我们返回一个file ... 
- linux 命令总结(转载)
		linux 命令总结(转载) 1. 永久更改ip ifconfig eth0 新ip 然后编辑/etc/sysconfig/network-scripts/ifcfg-eth0,修改ip 2.从Lin ... 
- 很全的linux网络编程技巧
		本文转载自:http://www.cnblogs.com/jfyl1573/p/6476607.html 1. LINUX网络编程基础知识 1 1.1. TCP/IP协议概述 1 1.2. OSI参考 ... 
- storysnail的Linux串口编程笔记
		storysnail的Linux串口编程笔记 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据Ge ... 
- Linux 网络编程(IO模型)
		针对linux 操作系统的5类IO模型,阻塞式.非阻塞式.多路复用.信号驱动和异步IO进行整理,参考<linux网络编程>及相关网络资料. 阻塞模式 在socket编程(如下图)中调用如下 ... 
- linux网络编程 no route to host 解决方案
		linux网络编程 no route to host 解决方案 [整合资料] (2013-05-13 21:38:12) 转载▼ 标签: net iptables it 分类: Linux 参考资料h ... 
- LINUX系统编程  由REDIS的持久化机制联想到的子进程退出的相关问题
		19:22:01 2014-08-27 引言: 以前对wait waitpid 以及exit这几个函数只是大致上了解,但是看REDIS的AOF和RDB 2种持久化时 均要处理子进程运行完成退出和父进程 ... 
- Linux系统编程-setitimer函数
		功能:linux系统编程中,setitimer是一个经常被使用的函数,可用来实现延时和定时的功能. 头文件:sys/time.h 函数原型: int setitimer(int which, cons ... 
随机推荐
- SQL on Hadoop中用到的主要技术——MPP vs Runtime Framework
			转载声明 本文转载自盘点SQL on Hadoop中用到的主要技术,个人觉得该文章对于诸如Impala这样的MPP架构的SQL引擎和Runtime Framework架构的Hive/Spark SQL ... 
- 图片截取插件Cropper
			自己仿照github上的例子写的demo,github上的例子太抽象了,自己写的最适合自己,通俗易懂. <!DOCTYPE html> <html> <head> ... 
- 24点扑克牌游戏——(含java源码)(GUI实现)
			给出四个数字,要求,在其间添加运算符和括号,使得计算结果等于24. 括号的放置即为决定哪几个数先进行计算.所以,我们先确定首先进行计算的两个相邻的数,计算完成后,就相当于剩下三个数字,仍需要在它们之间 ... 
- 【AtCoder】AGC022 F - Leftmost Ball 计数DP
			[题目]F - Leftmost Ball [题意]给定n种颜色的球各k个,每次以任意顺序排列所有球并将每种颜色最左端的球染成颜色0,求有多少种不同的颜色排列.n,k<=2000. [算法]计数 ... 
- 利用Object.defineProperty 简化 Chrome插件本地存储操作
			通常谷歌插件本地存储写法很别扭☹,如 chrome.storage.sync.get(null,function(data){ //todo console.log(data); }); 如果get ... 
- ubuntu安装Android Studio开发环境
			1.下载 https://developer.android.com/studio/ 2.解压文件,将文件夹copy到/opt/ 3.进入/opt/android-studio/bin,运行./stu ... 
- lucene总结——(十七)
			(01)rownum和rowid有何区别? rownum在表结构中是看不见的,只能在select中明确写出rownum方可显示 rownum与不同的表绑定在一起,每张表都有自已的r ... 
- 编写pl/sql时,报错
			/* 写一个简单的PL/SQL */ declare a ; b ; c number; begin c:=(a+b)/(a-b); dbms_output.put_line(c); exceptio ... 
- 【codeforces】【比赛题解】#862 CF Round #435 (Div.2)
			这次比赛打得很舒服,莫名得了个Rank41,涨了219的Rating,就比较优秀.不过还是没有闫神厉害啊.题目链接::P. [A]MEX 题意: Evil博士把Mahmoud和Ehab绑架到了邪恶之地 ... 
- 【划水闲谈】Terraria 1.3.5更新
			我知道这本应是一个算法博客,但又有谁规定了不能发点其他内容呢? Terraria,一个有趣的沙盒游戏.在这里,你可以建造,挖掘,开始一次又一次新的冒险. 4月19日,Re-Logic承诺的官方中文版终 ... 
