signal overview

简要记录下signal 机制,

1. Linux 主要 signal 如下


       Signal     Value     Action   Comment
       ──────────────────────────────────────────────────────────────────────
       SIGHUP        1       Term    Hangup detected on controlling terminal
                                     or death of controlling process
       SIGINT        2       Term    Interrupt from keyboard       //CTRL + C
       SIGQUIT       3       Core    Quit from keyboard
       SIGILL        4       Core    Illegal Instruction
       SIGABRT       6       Core    Abort signal from abort(3)
       SIGFPE        8       Core    Floating point exception     //除0
       SIGKILL       9       Term    Kill signal
       SIGSEGV      11       Core    Invalid memory reference
       SIGPIPE      13       Term    Broken pipe: write to pipe with no
                                     readers
       SIGALRM      14       Term    Timer signal from alarm(2)       //alarm()
       SIGTERM      15       Term    Termination signal
       SIGUSR1   30,10,16    Term    User-defined signal 1
       SIGUSR2   31,12,17    Term    User-defined signal 2
       SIGCHLD   20,17,18    Ign     Child stopped or terminated
       SIGCONT   19,18,25    Cont    Continue if stopped

       SIGSTOP   17,19,23    Stop    Stop process
       SIGTSTP   18,20,24    Stop    Stop typed at tty
       SIGTTIN   21,21,26    Stop    tty input for background process
       SIGTTOU   22,22,27    Stop    tty output for background process



2. 主要系统调用 及 函数

       raise(3)        Sends a signal to the calling thread.

       kill(2)         Sends a signal to a specified process, to all members of a specified process  group,  or  to  all
                       processes on the system.

       signal(2)   signal - ANSI C signal handling


       SYNOPSIS
       #include <signal.h>
       typedef void (*sighandler_t)(int);
       sighandler_t signal(int signum, sighandler_t handler);



3. sample

#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/unistd.h>
#include <string.h>

#define MAXLINE 256


static void sig_int(int);
static void sig_tstp(int);
static void sig_fpe(int);
static void sig_alrm(int);

void sig_int(int signo)
{
	printf("interrupt INT %d\n%% ", signo);
}

void sig_tstp(int signo)
{
	printf("interrupt TSTP %d\n%% ", signo);
}

void sig_fpe(int signo)
{
	printf("interrupt FPE %d\n%% ", signo);
}

void sig_alrm(int signo)
{
	printf("interrupt ALRM %d\n%% ", signo);
}

int main(int argc, char* argv[])
{
	char buf[MAXLINE];
	pid_t	pid;
	int status;

	printf("\
usage : 1. no args --> execute command\n\
        2. a.out num	--> 10/num, num == 0--> SIGFPE, num == 10 --> SIGINT, others --> SIGALRM\n");
	
	if(signal(SIGINT, sig_int) == SIG_ERR) 
	{
		printf("signal error");	
	}
#if 0	
	if(signal(SIGTSTP, sig_tstp) == SIG_ERR)
	{
		printf("signal error");
	}
#endif

	if(signal(SIGFPE, sig_fpe) == SIG_ERR)
	{
		printf("signal error");
	}

	if(signal(SIGALRM, sig_alrm) == SIG_ERR)
	{
		printf("signal error");
	}
	if(argc == 2)
	{
		int bediv = atoi(argv[1]);
		
		int res = 10/bediv;
		
		if(res == 1)
		{
			raise(SIGINT);
		}else if(res > 0)
		{
			alarm(res);
			while(res)
			{
				printf("%d...\n", res);
				res--;	
				sleep(1); 
			}
		}else
		{
			// do nothing
		}

		printf("res = %d\n", res);
	}

	printf("%% ");	/* printf prompt (printf requires %% to print % )*/
	while(fgets(buf, MAXLINE, stdin) != NULL)
	{
		buf[strlen(buf) - 1] = 0;	/* replace new line with null */
		if((pid = fork()) < 0)
		{
			printf("fork error");
		}
		
		else if(pid == 0)	/* child */
		{
			execlp(buf, buf, (char *)0);
			printf("couldn't execute: %s\n", buf);
			exit(127);
		}
		
		/* parent */
		if((pid = waitpid(pid, &status, 0)) < 0 )
		{
			printf("waitpid error");
		}
		printf("%% ");
	}	
	exit(0);
}	

4. demo

river@river-Satellite-L510:~/workspace/unix-adanced-programing/chapter1/signal$ ./a.out 3
usage : 1. no args --> execute command
        2. a.out num	--> 10/num, num == 0--> SIGFPE, num == 10 --> SIGINT, others --> SIGALRM
3...
2...
1...
interrupt ALRM 14
% res = 0
% ls
a.out  signal_demo.c
% time
Usage: time [-apvV] [-f format] [-o file] [--append] [--verbose]
       [--portability] [--format=format] [--output=file] [--version]
       [--quiet] [--help] command [arg...]
% date
Fri Feb 27 23:33:37 CST 2015
% ^Cinterrupt INT 2
^Z
[21]+  Stopped                 ./a.out 3



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值