1. 信号列表
  1. SIGABRT 进程停止运行
  2. SIGALRM 警告钟
  3. SIGFPE 算述运算例外
  4. SIGHUP 系统挂断
  5. SIGILL 非法指令
  6. SIGINT 终端中断
  7. SIGKILL 停止进程(此信号不能被忽略或捕获)
  8. SIGPIPE 向没有读的管道写入数据
  9. SIGSEGV 无效内存段访问
  10. SIGQOUT 终端退出
  11. SIGTERM 终止
  12. SIGUSR1 用户定义信号1
  13. SIGUSR2 用户定义信号2
  14. SIGCHLD 子进程已经停止或退出
  15. SIGCONT 如果被停止则继续执行
  16. SIGSTOP 停止执行
  17. SIGTSTP 终端停止信号
  18. SIGTOUT 后台进程请求进行写操作
  19. SIGTTIN 后台进程请求进行读操作
  1. typedef void (*sighandler_t)(int);
  2. sighandler_t signal(int signum, sighandler_t handler);
  3. signal函数
  4. 作用1:站在应用程序的角度,注册一个信号处理函数
  5. 作用2:忽略信号,设置信号默认处理 信号的安装和回复
  6. 参数
  7. --signal是一个带signumhandler两个参数的函数,准备捕捉或屏蔽的信号由参数signum给出,接收到指定信号时将要调用的函数有handler给出
  8. --handler这个函数必须有一个int类型的参数(即接收到的信号代码),它本身的类型是void
  9. --handler也可以是下面两个特殊值:① SIG_IGN 屏蔽该信号 SIG_DFL 恢复默认行为
  1. //忽略,屏蔽信号
    #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <errno.h>
  6. #include <sys/types.h>
  7. #include <signal.h>
  8.  
  9. int main(int arg, char *args[])
  10. {
  11. pid_t pid=fork();
  12. if(pid==-)
  13. {
  14. printf("fork() failed! error message:%s\n",strerror(errno));
  15. return -;
  16. }
  17. //注册信号,屏蔽SIGCHLD信号,子进程退出,将不会给父进程发送信号,因此也不会出现僵尸进程
  18. signal(SIGCHLD,SIG_IGN);
  19. if(pid>)
  20. {
  21. printf("father is runing !\n");
  22. sleep();
  23. }
  24. if(pid==)
  25. {
  26. printf("i am child!\n");
  27. exit();
  28. }
  29. printf("game over!\n");
  30. return ;
  31. }
  1. //恢复信号
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <unistd.h>
  6. #include <errno.h>
  7. #include <sys/types.h>
  8. #include <signal.h>
  9.  
  10. void catch_signal(int sign)
  11. {
  12. switch (sign)
  13. {
  14. case SIGINT:
  15. printf("ctrl + C 被执行了!\n");
  16. //exit(0);
  17. break;
  18. }
  19. }
  20.  
  21. int main(int arg, char *args[])
  22. {
  23. //注册终端中断信号
  24. signal(SIGINT, catch_signal);
  25. char tempc = ;
  26. while ((tempc = getchar()) != 'a')
  27. {
  28. printf("tempc=%d\n", tempc);
  29. //sleep()
  30. }
  31. //恢复信号
  32. signal(SIGINT, SIG_DFL);
  33. while ()
  34. {
  35. pause();
  36. }
  37. printf("game over!\n");
  38. return ;
  39. }
  1. //signal()函数的返回值
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <unistd.h>
  6. #include <errno.h>
  7. #include <sys/types.h>
  8. #include <signal.h>
  9.  
  10. void catch_signal(int sign)
  11. {
  12. switch (sign)
  13. {
  14. case SIGINT:
  15. printf("ctrl + C 被执行了!\n");
  16. //exit(0);
  17. break;
  18. }
  19. }
  20.  
  21. int main(int arg, char *args[])
  22. {
  23. /*
  24. * signal()函数的返回值是signal()函数上一次的行为
  25. * */
  26. typedef void (*sighandler_t)(int);
  27. //因为第一次注册信号SIGINT,所以上一次的行为就是默认行为
  28. sighandler_t old=signal(SIGINT, catch_signal);
  29. if(old==SIG_ERR)
  30. {
  31. //注册信号失败
  32. perror("signal error");
  33. }
  34. /*正规写法*/
  35. if(signal(SIGQUIT,catch_signal)==SIG_ERR)
  36. {
  37. //注册新号失败
  38. perror("signal error");
  39. }
  40. char tempc = ;
  41. while ((tempc = getchar()) != 'a')
  42. {
  43. printf("tempc=%d\n", tempc);
  44. //sleep()
  45. }
  46. //把默认行为重新注册,不就是恢复默认信号了
  47. signal(SIGINT, old);
  48. while ()
  49. {
  50. pause();
  51. }
  52. printf("game over!\n");
  53. return ;
  54. }

Linux 信号详解一(signal函数)的更多相关文章

  1. Linux 信号详解四(pause,alarm)

    pause函数 --将进程置为可中断睡眠状态,然后它调用内核函数schedule(),使linux进程调度器找到另一个进程来运行. --pause使调用者进程挂起,知道一个信号被捕获. alarm函数 ...

  2. Linux 信号(二)—— signal 函数

    弗洛伊德认为:要解决这些苦恼,当事人就要通过回忆并理解自己早期的童年经历,来获得对潜意识冲突的顿悟.弗洛伊德的疗法被称为“精神分析” (psychoanalysis),在 20 世纪的很长一段时间被心 ...

  3. Linux 信号详解六(可靠信号与不可靠信号)

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h&g ...

  4. Linux 信号详解五(信号阻塞,信号未决)

    信号在内核中的表示 执行信号的处理动作成为信号递达(Delivery),信号从产生到递达之间的状态称为信号未决(Pending).进程可以选择阻塞(Block)某个信号. 被阻塞的信号产生时将保持在未 ...

  5. Linux 信号详解二(信号分类,信号处理,kill)

    信号分类 信号分为可靠信号和不可靠信号 不可靠信号的缺点 ①:处理完信号,需要重新再注册信号:②信号可能丢失. Linux已经对缺点①做了优化,现在的不可靠问题主要指的是信号可能丢失 信号还可以分为实 ...

  6. Linux 信号详解三(sleep,raise)

    sleep()函数 .sleep()函数作用:让进程睡眠 .能被信号打断,然后处理信号函数以后,就不再睡眠,直接向下执行代码 .sleep函数的返回值是剩余秒数 //sleep 函数 #include ...

  7. SIGPIPE信号详解

    转自:http://blog.csdn.net/lmh12506/article/details/8457772 前一段面试的时候被问到项目中有没有处理SIGPIPE信号,怎么处理的?当时没有答出来, ...

  8. Linux 系统结构详解

    Linux 系统结构详解 Linux系统一般有4个主要部分: 内核.shell.文件系统和应用程序.内核.shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序.管理文件并使用系统 ...

  9. (转)Linux PS 详解

    原文:https://cn.aliyun.com/jiaocheng/162702.html 摘要:原文地址:http://www.cnblogs.com/wangkangluo1/archive/2 ...

随机推荐

  1. zend studio 9.0.4 破解、汉化和字体颜色及快捷键相关设置

    转载:http://www.penglig.com/post-45.html 下载:http://www.geekso.com/component/zendstudio-downloads/ 破解:h ...

  2. 对js中Function的浅见

    它到底是什么 String Array 都是系统内置对象(已经定义好,可以直接使用)当然,这货也是一样,我们之前定义的函数,其实就是一个这货的实例. 在JS中,所有的对象都是由函数实现的,函数的数据类 ...

  3. 磁带机Media is unrecognized

    早晨检查磁带备份作业时,发现有个驱动的作业一直处于"Queue"状态,检查发现驱动有磁带,在Alert里面发现出现下面"Media is unrecognized&quo ...

  4. ASP.NET Web API 简介

    ASP.NET MVC 4 包含了 ASP.NET Web API, 这是一个创建可以连接包括浏览器.移动设备等多种客户端的 Http 服务的新框架, ASP.NET Web API 也是构建 RES ...

  5. 工作中常用的Linux命令:mkdir命令

    本文链接:http://www.cnblogs.com/MartinChentf/p/6076075.html (转载请注明出处) 在Linux系统中,mkdir命令用来创建一个目录或一个级联目录. ...

  6. Sqlserver2008 数据库镜像会话的初始连接

    sqlserver2008 数据库镜像服务配置完成后,大家会发现我们有了两个数据库服务,这两个服务可以实现自动故障转移,那么我们的程序如何实现自动连接正常的数据库呢? 这个问题很简单,使用ADO.NE ...

  7. 支付宝APP支付开发- IOException : DER input, Integer tag error

    支付宝APP支付Java开发报错: 1 java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: I ...

  8. 如何在TFS中恢复系统默认查询”已指派给我”的设置(TFS 2013)

    故事是这样开始的,一天开发人员求助说,在浏览器中修改了系统默认的工作项查询"已指派给我"的后,发现这个查询每次都提示超时,并且没有办法恢复到初始的设置状态,因为出现超时提示以后,查 ...

  9. css3中变形与动画(三)

    transform可以实现矩阵变换,transition实现属性的平滑过渡,animation意思是动画,动漫,这个属性才和真正意义的一帧一帧的动画相关.本文就介绍animation属性. anima ...

  10. 【转载】阎焱:90后创业是扯淡 大量O2O和P2P公司濒临倒闭

    真正创业成功的大部分是年龄在30岁到38岁之间,很多90后基本什么都不懂.从历史来看,在这样的人口大国,集体性行为,无论是政治的还是经济的,基本都是导致灾难性后果. 10月14日消息,赛富基金创始首席 ...