http://blog.csdn.net/muge0913/article/details/7331129

要对一个信号进行处理,就需要给出此信号发生时系统所调用的处理函数。可以对一个特定的信号(除去SIGKILL和SIGSTOP信号)注册相应的处理函数。注册某个信号的处理函数后,当进程接收到此信号时,无论进程处于何种状态,就会停下当前的任务去执行此信号的处理函数。

1、注册信号函数。

  1. #include<signal.h>
  2. void(*signal(int signumber,void ((*func)(int))(int)

signumber表示信号处理函数对应的信号。func是一个函数指针。此函数有一整型参数,并返回void型。其实func还可以取其他定值如:SIG_IGN,SIG_DFL.

SIG_IGN表示:忽略signumber所指出的信号。SIG_DFL表示表示调用系统默认的处理函数。signal函数的返回值类型同参数func,是一个指向某个返回值为空并带有一个整型参数的函数指针。其正确返回值应为上次该信号的处理函数。错误返回SIG_ERR

signal示例如下:

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <stdlib.h>
  4. #include <signal.h>
  5. void func(int sig)
  6. {
  7. printf("I get asignal!\n");
  8. }
  9. int main()
  10. {    charbuffer[100];
  11. if(signal(SIGINT, func) == SIG_ERR)
  12. {
  13. printf("signalerror exit now\n");
  14. exit(0);
  15. }
  16. printf("pid:%ld\n",(long)getpid());
  17. for(;;)
  18. {
  19. fgets(buffer,sizeof(buffer),stdin);
  20. printf("bufferis:%s\n",buffer);
  21. }
  22. return 0;
  23. }

通常情况下一个用户进程需要处理多个信号。可以在一个程序中注册多个信号处理函数。一个信号可以对应一个处理函数,同时多个信号可以对应一个处理函数。

对于SIGINT信号 我们可以用ctrl+c或ctrl+z来中断进程,来执行SIGINT注册的函数。

2、 高级信号处理。

在linux系统提供了一个功能更强的系统调用。

  1. #include <signal.h>
  2. int sigaction(int signumbet,const structsigaction *act,struct sigaction *oldact)

此函数除能注册信号函数外还提供了更加详细的信息,确切了解进程接收到信号,发生的具体细节。

struct sigaction的定义如下:在linux2.6.39/include/asm-generic/signal.h中实现

  1. struct sigaction
  2. {
  3. void(*sa_handler)(int);
  4. void(*sa_sigaction)(int,siginfo_t *,void *);
  5. sigset_tsa_mask;
  6. intsa_flags;
  7. }

siginfo_t在linux2.6.39/include/asm-generic/siginfo.h中实现:

sa_flags的取值如下表,取0表示选用所有默认选项。

SA_NOCLDSTOP:用于表示信号SIGCHLD,当子进程被中断时,不产生此信号,当且仅当子进程结束时产生此信号。

SA_NOCLDWATI:当信号为SIGCHLD,时可避免子进程僵死。

SA_NODEFER:当信号处理函数正在进行时,不堵塞对于信号处理函数自身信号功能。

SA_NOMASK:同SA_NODEFER

SA_ONESHOT:当用户注册的信号处理函数被执行过一次后,该信号的处理函数被设为系统默认的处理函数。

SA_RESETHAND:同SA_ONESHOT

SA_RESTART:是本来不能重新于运行的系统调用自动重新运行。

SA_SIGINFO:表明信号处理函数是由SA_SIGACTION指定的,而不是由SA_HANDLER指定的,它将显示更多的信号处理函数信息。

其实sinaction完全可以替换signal函数

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <stdlib.h>
  4. #include <signal.h>
  5. void func(int sig)
  6. {
  7. printf("I get a signal!\n");
  8. }
  9. int main()
  10. {   char buffer[100];
  11. struct sigaction act;
  12. act.sa_handler=func;
  13. sigemptyset(&act.sa_mask);
  14. act.sa_flags = 0;
  15. if(sigaction(SIGINT,&act, NULL) == -1)
  16. {
  17. printf("sigaction error exit now\n");
  18. exit(0);
  19. }
  20. printf("pid:%ld\n",(long)getpid());
  21. for(;;)
  22. {
  23. fgets(buffer,sizeof(buffer),stdin);
  24. printf("buffer is:%s\n",buffer);
  25. }
  26. return 0;
  27. }

linux c 之signal 和sigaction区别的更多相关文章

  1. Linux 信号:signal 与 sigaction

    0.Linux下查看支持的信号列表: france@Ubuntux64:~$ kill -l ) SIGHUP ) SIGINT ) SIGQUIT ) SIGILL ) SIGTRAP ) SIGA ...

  2. Linux进程间通信(一): 信号 signal()、sigaction()

    一.什么是信号 用过Windows的我们都知道,当我们无法正常结束一个程序时,可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢?同样的功能在Linux上是通过生成信号和捕获信号来实现的,运行中 ...

  3. Linux信号(signal) 机制分析

    Linux信号(signal) 机制分析 [摘要]本文分析了Linux内核对于信号的实现机制和应用层的相关处理.首先介绍了软中断信号的本质及信号的两种不同分类方法尤其是不可靠信号的原理.接着分析了内核 ...

  4. Linux信号(signal) 机制分析(转)

    [摘要]本文分析了Linux内核对于信号的实现机制和应用层的相关处理.首先介绍了软中断信号的本质及信号的两种不同分类方法尤其是不可靠信号的原理.接着分析了内核对于信号的处理流程包括信号的触发/注册/执 ...

  5. Linux信号(signal) 机制分析-(转自h13)

    [摘要]本文分析了Linux内核对于信号的实现机制和应用层的相关处理.首先介绍了软中断信号的本质及信号的两种不同分类方法尤其是不可靠信号的原理.接着分析了内核对于信号的处理流程包括信号的触发/注册/执 ...

  6. signal() 和 sigaction()

    [摘自<Linux/Unix系统编程手册>] Unix系统提供了两种方式来改变信号处置:signal() 和 sigaction(). signal() 的行为在不同Unix实现间存在差异 ...

  7. Linux Kernel: buffers和cached的区别

    The page cache caches pages of files to optimize file I/O. The buffer cache caches disk blocks to op ...

  8. Linux read/write fread/fwrite两者区别

    Linux read/write fread/fwrite两者区别 1,fread是带缓冲的,read不带缓冲. 2,fopen是标准c里定义的,open是POSIX中定义的. 3,fread可以读一 ...

  9. 信号处理signal、sigaction、pause、信号嵌套处理、不可重入函数

    信号的捕捉和处理 主要由signal和sigaction函数来完成.还有一个函数pause,它可用来响应任何信号,不过不做任何处理. 1.signal函数 typedef void (*sighand ...

随机推荐

  1. 单元测试利器JUnit4

    引言 毋庸置疑,程序员要对自己编写的代码负责,您不仅要保证它能通过编译,正常地运行,而且要满足需求和设计预期的效果.单元测试正是验证代码行为是否满足预期的有效手段之一.但不可否认,做测试是件很枯燥无趣 ...

  2. Sql排名和分组排名

    在很多时候,都有排名这个功能,比如排行榜,并且还需要分页的功能,一般可以再select的时候按照某一字段 oorder by XX desc,这样limit 查找就可以得到排名信息,但是有时候是需要多 ...

  3. 关于“无法解析的外部符号”和“该符号在函数_wmain 中被引用”的问题

    在VS2008和opendv的环境下: error LNK2019: 无法解析的外部符号_cvDestroyWindow,该符号在函数_wmain 中被引用 error LNK2019: 无法解析的外 ...

  4. STL之Errors and Exceptions

    Error Handling STL设计的目标是性能最优化,而不是最安全. 错误检查是极其浪费时间的,因此,STL对于错误处理几乎没有做处理,因此,这对STL的使用者的要求就非常高. 为什么不采取错误 ...

  5. Ubuntu12.04下使用valgrind内存测试工具测试Qt程序

    1. 到官网http://valgrind.org/downloads/上下载valgrind最新版本: 2. 解压源码,执行./configure;make;make install后,默认安装到/ ...

  6. Ajax提交Form表单及文件上传

    刚刚申请下来的博客,写得第一篇.有点小激动,本人以前是一名工业3D设计师突然有些变故做上了JavaWeb开发: 前几天,发现了一些小问题.我在写后台管理页面时,需要上传一张图片.于是我就用很普通的Fo ...

  7. yii criteria select column as 与 时间段查询

    需要查询某时间段的记录,但是数据库里只有一个时间记录,如果写sql的话,很快的,放到yii里一时竟然没办法... 不过,最后还是解决了,使用了一个第三方的插件 参考http://www.yiifram ...

  8. git some cookies

    *首先得配置和本地的操作实际上都很简单,忽略了:*git 添加远程仓库 git remote add 仓库名 url:*先pull下来,语法 git pull 远程仓库名 远程分支名[:当地分支名], ...

  9. angularjs中的绑定策略“@”,“=”,“&”实例

    <!DOCTYPE html> <html lang="zh-CN" ng-app="app"> <head> <me ...

  10. JAVA-5-关于for循环的几个例子

    打印一个*组成的矩形 public static void main(String[] args) { // TODO 自动生成的方法存根 for (int i = 0; i < 5; i++) ...