//父子进程信号通信 //signal 接收信号 //kill 发送信号 [root@localhost chapter11]# cat alarm.c /* In alarm.c, the first function, ding, simulates an alarm clock. */ #include <signal.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> static int alarm_fired = 0; void ding(int sig) { alarm_fired = 1; } /* In main, we tell the child process to wait for five seconds before sending a SIGALRM signal to its parent. */ int main() { pid_t pid; printf("alarm application starting\n"); pid = fork(); switch(pid) { case -1: /* Failure */ perror("fork failed"); exit(1); case 0: /* child */ sleep(5); kill(getppid(), SIGALRM); exit(0); } /* The parent process arranges to catch SIGALRM with a call to signal and then waits for the inevitable. */ printf("waiting for alarm to go off \n"); (void) signal(SIGALRM, ding); pause(); if (alarm_fired) printf("Ding!\n"); printf("done\n"); exit(0); } [root@localhost chapter11]# ./alarm alarm application starting waiting for alarm to go off Ding! done [root@localhost chapter11]#
另一个接收信号的函数 sigaction
[root@localhost chapter11]# cat ctrlc2.c #include <signal.h> #include <stdio.h> #include <unistd.h> void ouch(int sig) { printf("OUCH! - I got signal %d\n", sig); } int main() { struct sigaction act; act.sa_handler = ouch; sigemptyset(&act.sa_mask); act.sa_flags = 0; sigaction(SIGINT, &act, 0); while(1) { printf("Hello World!\n"); sleep(1); } } [root@localhost chapter11]# ./ctrlc2 Hello World! Hello World! ^COUCH! - I got signal 2 Hello World! ^COUCH! - I got signal 2 Hello World! ^COUCH! - I got signal 2 Hello World! ^COUCH! - I got signal 2 Hello World! ^COUCH! - I got signal 2 Hello World! ^COUCH! - I got signal 2 Hello World! Hello World! Hello World! Hello World! ^COUCH! - I got signal 2 Hello World! Hello World! Hello World! ^\Quit (core dumped) [root@localhost chapter11]#
常用信号:
[root@localhost chapter11]# cat /usr/include/bits/signum.h /* Signal number definitions. Linux version. Copyright (C) 1995,1996,1997,1998,1999,2003 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #ifdef _SIGNAL_H /* Fake signal functions. */ #define SIG_ERR ((__sighandler_t) -1) /* Error return. */ #define SIG_DFL ((__sighandler_t) 0) /* Default action. */ #define SIG_IGN ((__sighandler_t) 1) /* Ignore signal. */ #ifdef __USE_UNIX98 # define SIG_HOLD ((__sighandler_t) 2) /* Add signal to hold mask. */ #endif /* Signals. */ #define SIGHUP 1 /* Hangup (POSIX). */ #define SIGINT 2 /* Interrupt (ANSI). */ #define SIGQUIT 3 /* Quit (POSIX). */ #define SIGILL 4 /* Illegal instruction (ANSI). */ #define SIGTRAP 5 /* Trace trap (POSIX). */ #define SIGABRT 6 /* Abort (ANSI). */ #define SIGIOT 6 /* IOT trap (4.2 BSD). */ #define SIGBUS 7 /* BUS error (4.2 BSD). */ #define SIGFPE 8 /* Floating-point exception (ANSI). */ #define SIGKILL 9 /* Kill, unblockable (POSIX). */ #define SIGUSR1 10 /* User-defined signal 1 (POSIX). */ #define SIGSEGV 11 /* Segmentation violation (ANSI). */ #define SIGUSR2 12 /* User-defined signal 2 (POSIX). */ #define SIGPIPE 13 /* Broken pipe (POSIX). */ #define SIGALRM 14 /* Alarm clock (POSIX). */ #define SIGTERM 15 /* Termination (ANSI). */ #define SIGSTKFLT 16 /* Stack fault. */ #define SIGCLD SIGCHLD /* Same as SIGCHLD (System V). */ #define SIGCHLD 17 /* Child status has changed (POSIX). */ #define SIGCONT 18 /* Continue (POSIX). */ #define SIGSTOP 19 /* Stop, unblockable (POSIX). */ #define SIGTSTP 20 /* Keyboard stop (POSIX). */ #define SIGTTIN 21 /* Background read from tty (POSIX). */ #define SIGTTOU 22 /* Background write to tty (POSIX). */ #define SIGURG 23 /* Urgent condition on socket (4.2 BSD). */ #define SIGXCPU 24 /* CPU limit exceeded (4.2 BSD). */ #define SIGXFSZ 25 /* File size limit exceeded (4.2 BSD). */ #define SIGVTALRM 26 /* Virtual alarm clock (4.2 BSD). */ #define SIGPROF 27 /* Profiling alarm clock (4.2 BSD). */ #define SIGWINCH 28 /* Window size change (4.3 BSD, Sun). */ #define SIGPOLL SIGIO /* Pollable event occurred (System V). */ #define SIGIO 29 /* I/O now possible (4.2 BSD). */ #define SIGPWR 30 /* Power failure restart (System V). */ #define SIGSYS 31 /* Bad system call. */ #define SIGUNUSED 31 #define _NSIG 65 /* Biggest signal number + 1 (including real-time signals). */ #define SIGRTMIN (__libc_current_sigrtmin ()) #define SIGRTMAX (__libc_current_sigrtmax ()) /* These are the hard limits of the kernel. These values should not be used directly at user level. */ #define __SIGRTMIN 32 #define __SIGRTMAX (_NSIG - 1) #endif /* <signal.h> included. */ [root@localhost chapter11]#
信号 值 动作 解释 SIGHUP 1 终端线路挂断 SIGINT 2 Term 键盘输入的中断命令,从终端输入 Ctrl-C 时发生 SIGQUIT 3 Core 键盘输入的退出命令 SIGILL 4 Core 错误指令 SIGABRT 6 Core abort(3)发出的中止信号 SIGFPE 8 Core 浮点数异常 SIGKILL 9 Term KILL信号 SIGSEGV 11 Core 非法内存访问 SIGPIPE 13 Term 管道断开 SIGALRM 14 Term alarm(2)发出的中止信号 SIGTERM 15 Term 强制中止信号 SIGUSR1 30,10,16 Term 用户自定义信号1 SIGUSR2 31,12,17 Term 用户自定义信号2 SIGCHLD 20,17,18 Ign 子进程中止信号 SIGCONT 19,18,25 Cont 继续执行一个停止的进程 SIGSTOP 17,19,23 Stop 非终端来的停止信号 SIGTSTP 18,20,24 Stop 终端来的停止信号 SIGTTIN 21,21,26 Stop 后台进程读终端 SIGTTOU 22,22,27 Stop 后台进程写终端 refer to http://tech.idv2.com/2006/09/28/useful-linux-signals/