10.22 信号名称与编号

在本节中,我们将会讲述如何在信号编号与信号名称之间进行映射。一些系统提供了数组

extern char *sys_siglist[];

其中数组索引就是信号编号,给出一个指向信号名称字符串的指针。

FreeBSD 8.0, Linux 3.2.0以及 Mac OS X 10.6.8都提供了这个信号名称的数组,Solaris 10也提供了,但是指针数组名称为_sys_siglist.

为了可移植地实现某一信号编号对应信号名称的字符串的打印,我们可以使用函数psignal.

  1. #include <signal.h>
  2. void psignal(int signo, const char *msg);

字符串msg将会被输出到标准错误中,并且后面紧跟着一个冒号以及空格,接下来是信号的描述信息以及一个换行符。如果参数msg是NULL,那么仅仅只有描述会被写出到标准输出中,该函数与函数perror类似(1.7节)。

如果你有一个来源于sigaction信号处理函数的siginfo结构,你可以使用函数psiginfo函数来打印信号信息。

  1. #include <signal.h>
  2. void psiginfo(const siginfo_t *info, const char *msg);

该函数的功能与函数psignal相类似,虽然该函数除了信号处理函数之外还有很多可以访问的信息,但是具体打印的信息因平台而异。

如果你只是需要字符串描述,并不想要将其写出到标准错误中去,比如说,你只是想要将其写到一个日志文件中去,那么你可以使用函数strsignal,该函数与函数strerror相似(1.7节中讲到)。

  1. #include <string.h>
  2. char *strsignal(int signo);
  3. Returns: a pointer to a string describing the signal.

给定一个信号编号,函数strsignal就可以返回描述该信号的字符串。该字符串可以被应用程序用于打印接收到信号的错误信息。

本书中讲到的四个平台都实现了函数psignal以及strsignal,但是存在差异,在Solaris 10上,strsignal在信号编号无效的时候会返回一个空指针,而FreeBSD 8.0,Linux 3.2.0以及 Mac OS X 10.6.8会返回一个现实信号不可识别的字符串。

仅仅只有Linux 3.2.0以及Solaris 10支持函数psiginfo.

Solaris还提供了一对函数用于在信号编号与信号名称之间做转换。

  1. #include <signal.h>
  2. int sig2str(int signo, char *str);
  3. int str2sig(const char *str, int *signop);
  4. Both return: 0 if OK, -1 on error.

该函数对于需要接受和打印信号名称以及信号编号的交互式程序非常有用。

函数sig2str将信号编号转换成字符串并存储结果到str指向的内存中,调用者必须确保内存足够大来保存最大的字符串,包括终止的null字节,Solaris在中提供了常量SIG2STR_MAX来定义了最大字符长度,字符串包含了不带前缀”SIG”的信号名称,举例来说,转换信号SIGKILL的结果是”KILL”被存储到内存中。

函数str2sig将给定的信号名称转换成信号编号,信号编号被存储到整形指针指向的内存中,信号名称要么是没有SIG前缀的信号名,要么是十进制数,比如说”9”.

注意,函数sig2str与函数str2sig与常规惯例是不一样的,它们在执行失败的时候并不会设置errno.

Example

  1. #include <stdio.h>
  2. #include <signal.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. int main(void)
  6. {
  7. char msg[256] = "This is what I want to output before signal description:\n";
  8. psignal(SIGUSR1,msg);
  9. printf("msg = %s\n", msg);
  10. }

执行效果如下图所示:

  1. [email protected]:~/UnixProgram/Chapter10$ ./10_FF.exe
  2. This is what I want to output before signal description:
  3. : User defined signal 1
  4. msg = This is what I want to output before signal description:
  5. [email protected]:~/UnixProgram/Chapter10$

来自为知笔记(Wiz)

时间: 2024-10-10 21:58:58

10.22 信号名称与编号的相关文章

10.2信号的概念

首先,每一个信号都有一个名字,这些名字都是使用相同的三个字母SIG 开始的.举例来说,SIGABRT是当进程调用数abort的时候生成的终止信号.SIGALRM是当函数alaram设置的定时时间到的时候生成的alarm信号.版本7已经有了15中信号:SVR4以及4.4BSD有31种不同的信号,FreBSD 8.0支持32中不同的信号:Mac OS X10.6.8以及Linux3.2.0各支持31中不同的信号:同时Solaris 10支持40中不同的信号.此外,FreeBSD,Linux以及Sol

2014年4月23日 10:22:08

step 1 : 做tcp网络编程,要解析一批批的数据,可是数据是通过Socket连接的InputStream一次次读取的,读取到的不是需要转换的对象,而是要直接根据字节流和协议来生成自己的数据对象. 按照之前的编程思维,总是请求然后响应,当然Socket也是请求和响应,不过与单纯的请求响应是不同的. 这里Socket连接往往是要保持住的,也就是长连接,然后设置一个缓冲区,网络流不断的追加到缓冲区.然后后台去解析缓冲区的字节流. http://cuisuqiang.iteye.com/blog/

Daily Scrum 10.22

(写于10.22周四0晨) 昨天任务还未完成的继续完成任务. 每个人都查看自己的TFS,修改已经完成的任务状态,改为已关闭-已完成. 由于android studio运行过于慢,我们统一采取eclipse. 按照目前的进度,大家今天上午将环境都配好,目前的配置是: ADT:按照康家华给的版本配置 SDK:manager统一装4.0.3,在eclipse的路径选择中也选4.0.3 Eclipse:Luna 康家华和马瑶华继续昨天未完成的UI的工作,自定义的部分可以稍微放一下,主要框架先出来. 张启

IOS中使用百度地图定位后获取城市坐标,城市名称,城市编号信息

IOS中使用百度地图定位后获取城市坐标,城市名称,城市编号信息 /**当获取到定位的坐标后,回调函数*/ - (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation{ BMKCoordinateRegion region; region.center.latitude  = userLocation.location.coordinate.latitude; region.center.longitude = userLoca

[学习笔记]信号基本概念(中断和信号)/名称及常用信号/信号处理/signal函数实践

1基本概念 中断 q  中断是系统对于异步事件的响应 q  中断信号 q  中断源 q  现场信息 q  中断处理程序 q  中断向量表 异步事件的响应:进程执行代码的过程中可以随时被打断,然后去执行异常处理程序 生活中的中断和计算机系统中的中断 1)  无中断生活场景 张三看书,厨房烧水 2)有中断的生活场景 张三看书,设置闹钟,厨房烧水. 闹钟发出中断信号,张三把书合好(第20页),去厨房把开水事情处理好,张三重新打开20页进行阅读. 3)计算机系统的中断场景 中断源发出中断信号,CPU判断

10.22 模拟赛

10.22 模拟赛 T1 染色 考虑每个连通块删成一棵树就好了. mmp场上就我路径压缩写炸.... #include<iostream> #define MAXN 200006 using namespace std; int n , m; int fa[MAXN] , siz[MAXN] , book[MAXN] , sz[MAXN]; int find(int x) { return x == fa[x] ? x : fa[x] = find(fa[x]); } int main() {

2016.10.19 小米前端面试 vs 2016.10.22 华为web面试

这次面试还是很值得记录一下的~长了很多姿势. 一共三面,面试官都是MIUI的浏览器部门,感觉面试官都很厉害,知识点问的很细很深入. 一面面试官是个可爱的小姑娘,主要考察的就是常见的前端面试题,很基础,但是会在其上进行拓展和深入.就我记得的一些题做个总结: 1. 说一下CSS的盒模型?(这简直是我参加过的几乎所有前端面试岗必问的一道题目--不管是比较水的国企还是问基础的互联网... 想一想似乎只有只问项目不谈基础的京东没有问吧) 这里是答案 2. 常用的跨域方法:(之前小米一个面试官电话面试时候也

《Unix环境高级编程》读书笔记 第10章-信号

1.引言 信号是软件中断. 信号提供了一种处理异步事件的方法. 2. 信号概念 信号的名字都是以3个字符SIG开头. Linux3.2.0支持31种信号.FreeBSD.Linux和Solaris作为实时扩展都支持另外的应用程序定义的信号. 在头文件signal.h(其中include的bits/signum.h)中,信号名都被定义为正整数常量,不存在编号为0的信号.kill函数对信号编号0有特殊的应用. 很多条件可以产生信号: 用户按下某些终端键时:Ctrl+C.Ctrl+\.Ctrl+Z 硬

10.22~10.28一周经典题目整理(meeting,BZOJ4377,POJ3659)

meeting:给正n边形每个点染上黑色或者白色,问有多少个同色的等腰三角形. 以正五边形为例这里将最上面的点作为顶点,得到若干对相等的腰 ,注意到以最上面的点作为顶点的等腰三角形的个数,等于颜色相等且都为顶点颜色的对称点的个数. O(n^2)统计即可. PS:注意减去等边三角形的情况. 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <cstdlib> 5