美文网首页LinuxLinux学习之路
APUE读书笔记-10信号(15)

APUE读书笔记-10信号(15)

作者: QuietHeart | 来源:发表于2020-06-15 08:09 被阅读0次

21、其它特性

在这里,我们描述一些和实现相关的额外的信号特性。

(1)信号名称

有一些系统使用一个数组:

extern char *sys_siglist[];

这个数组的索引就是信号的号码,相应的数组元素指向一个表示信号名称的字符串。

FreeBSD 5.2.1,Linux 2.4.22,和Mac OS X 10.3提供了这样的信号名称数组。Solaris9也这样做了,但是它使用名字_sys_siglist。这些系统都提供如下的psignal函数:

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

字符串msg(一般是程序的名称)会被输出到标准错误输出,然后跟着一个冒号和空格,再跟着信号的描述,和一个换行符号。这个函数和perror非常类似。

另外一个比较普遍的函数就是strsignal.这个函数和strerror很类似:

#include <string.h>
char *strsignal(int signo);

返回:一个指向描述信号的字符串指针。

给定一个信号号码,strsignal将会返回一个描述这个信号的字符串,这个字符串可以被应用程序使用,来打印关于接到的信号的错误消息。

这本书中描述的所有平台,都提供了psignal和strsignal函数,但是有所不同。Solaris 9中,如果信号号码是非法的话,strsignal将会返回一个空指针;FreeBSD 5.2.1,Linux 2.4.22,和Mac OS X 10.3在信号号码未知的时候会返回一个表示信号号码未知的字符串。为了有一个psignal函数的声明,你需要包含<siginfo.h>文件。

(2)信号映射

Solaris提供了一对用来在信号号码和信号名称之间映射的函数。

#include <signal.h>
int sig2str(int signo, char *str);
int str2sig(const char *str, int *signop);

两者返回:如果成功返回0,如果错误返回1。

这些函数在写打印和接收信号名称和信号号码的交互程序的时候,很有用。

sig2str函数把指定的信号号码变成一个字符串,并且把结果存放在str指向的内存中。调用这必须保证内存足够大(包含null).Solaris在<signal.h>里面提供了常量SIG2STR_MAX,用来定义最大字符串长度。字符串将会包含信号的名称(没有SIG前缀)。例如SIGKILL会被映射成"KILL".

str2sig函数会把指定的名字转换成信号号码。信号号码被存放在一个signop指向的整数指针中。名字可以是没有SIG前缀的字符串,也可以是代表十进制信号值的字符串(例如"9")。

注意sig2str和str2sig和一般的函数不一样,它门不会设置errno.

译者注

原文参考

参考: APUE2/ch10lev1sec21.html

22、总结

信号在许多重要的应用程序中都有应用。对于高级unix系统编程来说,了解信号处理函数为什么以及如何做的是非常重要的。本章对unix系统的信号部分做了一个比较全面的介绍。我们首先见识了早期系统实现中信号部分的缺陷;然后我们涉及到POSIX.1中的可靠信号概念以及所有相关的函数;当我们把所有这些的细节都说明过了之后,我们就能够编写POSIX.1的abort,system,和sleep函数的实现了;我们最后介绍了作业控制信号和信号名称和信号号码之间的切换。

练习发现需要注意的问题:

  1. signal需要在捕获signal的时候重新建立signal连接,是否都这样?而signalaction方式就不需要了?还是新的signal本身就不需要这样了?
  2. sigchld信号是否是wait的时候才进行捕捉?还是不用wait就会捕捉?

译者注

原文参考

参考: APUE2/ch10lev1sec22.html

相关文章

  • APUE读书笔记-10信号(15)

    21、其它特性 在这里,我们描述一些和实现相关的额外的信号特性。 (1)信号名称 有一些系统使用一个数组: 这个数...

  • APUE读书笔记-10信号(10)

    15、sigsetjmp和siglongjmp函数 前面,我们描述了setjmp和logjmp函数,这个函数可以用...

  • 信号函数编写研究

    APUE读书笔记 ToDoList [ ] sleep初级实现 2017年12月6日 10:41:30 [ ] ...

  • APUE读书笔记-10信号(13)

    19、sleep函数 我们在本文中的许多例子里都使用了sleep函数,并且我们在本章前面给出了两个有缺陷的slee...

  • APUE读书笔记-10信号(2)

    3、signal函数 UNIX系统中最简单的一个信号相关的接口就是signal函数。声明如下: 如果成功,这个函数...

  • APUE读书笔记-10信号(3)

    5、被中断的系统调用 早期Unix系统的一个特性是当一个进程被阻塞在一个很慢的系统调用的时候捕捉到一个信号,这时候...

  • APUE读书笔记-10信号(4)

    6、可重入函数 进程捕捉到信号时,进程正常执行的指令次序会被信号处理打断。进程会继续执行,但是这时候执行的是信号处...

  • APUE读书笔记-10信号(5)

    7、SIGCLD的含义 有两个很容易导致混淆的信号是SIGCLD和SIGCHLD。首先,SIGCLD是System...

  • APUE读书笔记-10信号(6)

    9、kill和raise函数 kill用来给一个进程或者一组进程发送信号,raise函数允许进程给它自己发送信号。...

  • APUE读书笔记-10信号(7)

    11、信号集合 我们需要一种数据类型来表示包含多个信号的信号集合,我们使用诸如sigprocmask这样的函数来告...

网友评论

    本文标题:APUE读书笔记-10信号(15)

    本文链接:https://www.haomeiwen.com/subject/zfwoahtx.html