signal系统信号量

signal(<信号量类型>,<目标操作>)

常用信号量类型(经过验证)

SIGINT	:Ctrl+C 中断进程	  		
SIGTSTP	:Ctrl+Z 中断进程			
SIGCHLD	:子进程已经停止或退出	

(其他基本都没有效果,如果有人知道为什么,请留言讨论)

例程如下:

#include <stdio.h>
#include <signal.h>
int main(int argc,char *argv[])
{
	signal(SIGINT,SIG_IGN);
	printf("In main \n");
	while(1);
}

解释:
SIGINT :由InterruptKey产生的终端中断。
SIG_IGN :忽略该信号量。
(注意,网上很多人转的教程这个函数名是错误的,都写成了SIG_ING)
上面这段程序按下CTRL+C程是没有反应的。如果我们想结束该程序可以按下CTRL+\来结束。其实当我们按下CTRL+\组合键时,是产生了SIGQUIT信号。

目标操作

目标操作除了以上系统的宏定义操作外,用户可自定义目标。
操作方法:

#include <stdio.h>
#include <stdlib.h>
#include <signal.h> 

void hello(int sig)
{
	printf("In Hello %d \n",sig);
	exit(1);
}	

int main(int argc,char *argv[])
{    
	signal(SIGINT,hello);  //2
	signal(SIGTSTP,hello); //20
	signal(SIGCHLD,hello); //17

	printf("In main \n");
	while(1);
}

说明:
上面的程序被Ctrl+C中断时会打印 "该进程被终端中断" 的内容。


常用信号量类型表(附录)

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专用,进程超过资源限制的时候发送

posted @ 2018-01-14 23:26  WittXie  阅读(919)  评论(0编辑  收藏  举报