Chinaunix首页 | 论坛 | 博客
  • 博客访问: 129284
  • 博文数量: 19
  • 博客积分: 508
  • 博客等级: 下士
  • 技术积分: 306
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-11 21:04
文章分类

全部博文(19)

文章存档

2011年(16)

2009年(3)

我的朋友

分类: LINUX

2011-07-15 16:40:13

Outline 

- 1.信号的概念

- 2.信号使用入门

=================================================================================================

1. 信号的概念
在Unix系统中使用signal来实现异步通知。例如进程1正在运行,此时另一进程或系统希望使用某种方法通知进程1某个事件发生了(如发现插入了u盘),其中的一种手段就是使用信号机制。信号的产生主要有以下几种方式:
a)用户按键,如ctrl C
b)硬件异常,如引用无效内存
c)调用kill函数或者命令
d)软件发出信号
信号的处理有以下几种方式:
a)忽略
b)捕捉并处理
c)采用系统默认动作

信号在Unix系统中以SIG开头,为正整数,0有特殊用途。

SIGKILL \ SIGTERM  \ SIGINT区别
这三个信号通常用来终止进程,在bash中,分别是kill -9 、 kill、ctrl C发出的信号,看似相同,但其实差别很大,请参考

2. 信号使用入门 - signal()
  1. #include <signal.h>
  2. #include <unistd.h>
  3. #include <stdio.h>

  4. typedef void (*SIG_HANDLER)(int);

  5. static void sig_usr(int signo);

  6. int main()
  7. {
  8.     if (signal(SIGUSR1, sig_usr) == SIG_ERR)
  9.         printf("can't catch SIGUSR1");
  10.     if (signal(SIGUSR2, sig_usr) == SIG_ERR)
  11.         printf("can't catch SIGUSR2");
  12.     while (1)
  13.         sleep(1);
  14. }

  15. static void sig_usr(int signo)
  16. {
  17.     if (signo == SIGUSR1)
  18.         printf("SIGUSR1 captured.\n");
  19.     else if (signo == SIGUSR2)
  20.         printf("SIGUSR2 captured.\n");
  21. }
在终端中产生信号:
  1. deepsky@Debian:~$ kill -USR1 3619
  2. deepsky@Debian:~$ kill -USR2 3619
输出:
  1. SIGUSR1 captured.
  2. SIGUSR2 captured.

阅读(1572) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~