简要记录下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