本文将对两个信号处理函数进行介绍

1.signal

2.sigaction


1.signal

signal(设置信号处理方式)


相关函数 
sigaction,kill,raise

表头文件 
#include<signal.h>

定义函数 
void (*signal(int signum,void(* handler)(int)))

(int);

函数说明 
signal()会依参数signum 指定的信号编号来设置该信号
的处理函数。当指定的信号到达时就会跳转到参数handler指定的函数执行。如果参数handler不是函数指针,则必须是下列两个常数之一:
SIG_IGN 忽略参数signum指定的信号。
SIG_DFL 将参数signum 指定的信号重设为核心预设的信
号处理方式。
关于信号的编号和说明,请参考附录D

返回值 
返回先前的信号处理函数指针,如果有错误则返回
SIG_ERR(-1)。

附加说明 
在信号发生跳转到自定的handler处理函数执行后,系统会
自动将此处理函数换回原来系统预设的处理方式,如果要改变此操作请改用sigaction()。


下面给出应用的例子:

1.简单的调用

#include <stdio.h>
#include <signal.h>void sigcatcher(int signum);int main()
{char buffer1[100], buffer2[100];int i;if(signal(SIGTERM, &sigcatcher)==-1){printf("Couldn't register signal hanlder!\n");exit(1);}printf("Pid of This Process : %d \n",getpid());printf("Please input:\n");for(;;){fgets(buffer1, sizeof(buffer1),stdin);for(i=0;i<100;i++){if(buffer1[i]>=97&&buffer1[i]<=122)buffer2[i]=buffer1[i]-32;elsebuffer2[i]=buffer1[i];}printf("Your input is: %s \n\n",buffer2);}exit(0);
}void sigcatcher(int signum)
{printf("catch signal SIGTERM.\n");exit(0);
}

2.signal多次调用

可以处理多个信号的程序

#include <stdio.h>
#include <signal.h>void intfunc(int signum);
void continuefunc(int signum);
void exitfunc(int signum);int main()
{char buffer1[100],buffer2[100];int i;if(signal(SIGINT, &intfunc)==-1){printf("Couldn't register signal hanlder for SIGINT!\n");exit(1);}if(signal(SIGTSTP, &intfunc)==-1){printf("Couldn't register signal hanlder for SIGTSTP!\n");exit(1);}if(signal(SIGCONT, &continuefunc)==-1){printf("Couldn't register signal hanlder for SIGCONT!\n");exit(1);}if(signal(SIGTERM, &exitfunc)==-1){printf("Couldn't register signal hanlder for SIGTERM!\n");exit(1);}printf("Pid of This Process : %d \n",getpid());for(;;){printf("Please input:\n");fgets(buffer1, sizeof(buffer1),stdin);for(i=0;i<100;i++){if(buffer1[i]>=97&&buffer1[i]<=122)buffer2[i]=buffer1[i]-32;elsebuffer2[i]=buffer1[i];}printf("Your input is: %s \n",buffer2);}exit(0);
}void intfunc(int signum)
{printf("catch signal %d \n",signum);
}void continuefunc(int signum)
{printf("Continue.\n");
}void exitfunc(int signum)
{printf("signal SIGTERM \n");exit(0);
}

2.sigaction

sigaction(查询或设置信号处理方式)

相关函数 signal,sigprocmask,sigpending,sigsuspend

表头文件 #include<signal.h>

定义函数 int sigaction(int signum,const struct sigaction *act ,struct sigaction *oldact);

函数说明 sigaction()会依参数signum指定的信号编号来设置该信号的处理函数。参数signum可以指定SIGKILL和SIGSTOP以外的所有信号。
如参数结构sigaction定义如下
struct sigaction
{
void (*sa_handler) (int);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer) (void);
}
sa_handler此参数和signal()的参数handler相同,代表新的信号处理函数,其他意义请参考signal()。
sa_mask 用来设置在处理该信号时暂时将sa_mask 指定的信号搁置。
sa_restorer 此参数没有使用。
sa_flags 用来设置信号处理的其他相关操作,下列的数值可用。
OR 运算(|)组合
A_NOCLDSTOP : 如果参数signum为SIGCHLD,则当子进程暂停时并不会通知父进程
SA_ONESHOT/SA_RESETHAND:当调用新的信号处理函数前,将此信号处理方式改为系统预设的方式。
SA_RESTART:被信号中断的系统调用会自行重启
SA_NOMASK/SA_NODEFER:在处理此信号未结束前不理会此信号的再次到来。
如果参数oldact不是NULL指针,则原来的信号处理方式会由此结构sigaction 返回。

返回值 执行成功则返回0,如果有错误则返回-1。

错误代码 EINVAL 参数signum 不合法, 或是企图拦截SIGKILL/SIGSTOPSIGKILL信号EFAULT 参数act,oldact指针地址无法存取。
EINTR 此调用被中断

下面给出一个例子,这个例子和上面的程序实现相同的功能

#include <stdio.h>
#include <signal.h>
#include <string.h>void sighandler(int signum);int main()
{char buffer1[100], buffer2[100];int i;struct sigaction act;act.sa_handler=sighandler;sigemptyset(&act.sa_mask);act.sa_flags=0;if(sigaction(SIGTERM, &act, NULL)==-1){printf("Couldn't register signal handler!\n");return 1;}printf("Pid of thi process: %d \n",getpid());for(;;){printf("Please input:\n");fgets(buffer1, sizeof(buffer1),stdin);for(i=0;i<100;i++){if(buffer1[i]>=97&&buffer1[i]<=122)buffer2[i]=buffer1[i]-32;elsebuffer2[i]=buffer1[i];}printf("Your input is: %s \n",buffer2);}exit(0);
}void sighandler(int signum)
{printf("catch signal SIGTERM. \n");exit(0);
}

Linux C编程--进程间通信(IPC)2--信号处理函数相关推荐

  1. Linux C编程--进程间通信(IPC)1--进程间通信机制概述

    linux下进程间通信的几种主要手段简介: 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它 ...

  2. Linux C编程--进程间通信(IPC)3--信号集和发送信号介绍

    Linux信号集 1.信号集概念 信号集是一个能表示多个信号的数据类型,sigset_t set :set即一个信号集. 既然是一个集合,就需要对集合进行添加/删除等操作. int sigemptys ...

  3. Linux网络编程--进程间通信(一)

    进程间通信简介(摘自<Linux网络编程>p85) AT&T 在 UNIX System V 中引入了几种新的进程通讯方式,即消息队列( MessageQueues),信号量( s ...

  4. linux_unix编程手册--信号处理函数

    全部的代码都已上传github 地址:https://github.com/zzu-andrew/linux_unix 一般而言信号处理函数设计的越简单越好,其中最主要的原因就是降低引发竞争条件的风险 ...

  5. linux文件编程(3)—— main函数传参、myCp(配置成环境变量)、修改配置文件、整数和结构体数组写到文件

    参考:linux文件编程(3)-- 文件编程的简单应用:myCp.修改配置文件 作者:丶PURSUING 发布时间: 2021-04-09 23:45:05 网址:https://blog.csdn. ...

  6. Linux C编程--进程间通信(IPC)5--System V IPC 机制1--消息队列

    System V IPC 机制 1.基本概念 IPC对象一经创建,系统内核即为该对象分配相关的数据结构.为方便对IPC对象的管理,Linux提供了专门的IPC控制命令,主要包括查看IPC对象信息的ip ...

  7. Linux C编程--进程间通信(IPC)5--System V IPC 机制3--共享内存

    共享内存 最为高效的进程间通信方式   进程直接读写内存,不需要任何数据的拷贝 •为了在多个进程间交换信息,内核专门留出了一块内存区 •由需要访问的进程将其映射到自己私有地址空间 •进程直接读写这一内 ...

  8. Linux C编程--进程间通信(IPC)4--管道详解

    linux管道 管道相关内容的简介 管道是单向的字节流,它将某个进程的标准输出连接到另一个进程的标准输入.管道和有名管道是最早的进程间通信机制之一,管道可用于具有亲缘关系进程间的通信,有名管道克服了管 ...

  9. Linux C编程--进程间通信(IPC)5--System V IPC 机制2--信号量

    信号量定义 最简单的信号量是一个只有0与1两个值的变量,二值信号量.这是最为通常的形式.具有多个正数值的信号量被称之为通用信号量.在本章的其余部分,我们将会讨论二值信号量. P与V的定义出奇的简单.假 ...

最新文章

  1. [转载]windows内存优化 没你想像那么美
  2. python selenium 元素定位_python3+selenium入门04-元素定位
  3. FastDFS安装笔记和使用
  4. 测试Spring Boot有条件的合理方式
  5. jquery如何阻止子元素继承父元素的事件(又称事件冒泡)
  6. 2021抖音汽车生态报告
  7. Java 多线程 4:wait() 和 notify()/notifyAll()
  8. a4b5笔记本大小对比_【玩码】全新升级MX350独显 小米笔记本Pro 15 2020款为创造力而生...
  9. python计算器功能介绍_python计算器功能如何实现?这篇文章给你最实用的代码
  10. Ubuntu下安装的qq的下载文件地址
  11. python数学实验与建模pdf_Python数学实验与建模(4)
  12. [6.837]A3:OpenG应用和Phong着色模型
  13. android 系统闹钟 问题,android 闹钟设置问题(示例代码)
  14. IIS导入SSL证书
  15. 弘辽科技:DSR的含义是?怎么提升DSR评分?
  16. 磁盘结构损坏且无法读取硬盘磁盘结构损坏且无法读取的找回方案
  17. 产品读书《失控:全人类的最终命运和结局》KK
  18. android平板电脑怎么才能连接,安卓平板电脑如何连接网线?
  19. simulink实现他励直流电动机串电阻调速仿真
  20. 我的2022和2023(技术总结、开发工具简介和未来展望)

热门文章

  1. 给定一个字典,通过查找这个字典,替换给定的字符串中的中文为英文
  2. LigerUI 使用教程表格篇
  3. 高德地图SDK大致使用
  4. Python+opencv 图像拼接
  5. 网页性能管理详解:浅谈chrome-Timeline及window.requestAnimationFrame()方法
  6. iOS开发那些事-平铺导航–基于分屏导航及案例实现
  7. SQL函数--- SQL FIRST()
  8. Silverlight实例教程 - Out of Browser在线更新和Silent安装
  9. ISA系列之ISA Server 2004 中的新增功能--利用多个网络
  10. shell 去除 字符串中的双引号