引言
我们都知道signal函数可以对我们设置的特定信号进行特定的操作,但这不意味着我们可以随心所欲的设置处理函数,信号处理函数通常很麻烦,因为它不但与主程序之间是并发的,而且与其他的信号处理函数并发,这就意味着会出现一个问题,如果他们访问了同一个全局变量,上一个程序已经把这些信息存入程序的上下文中,与之并发的程序又修改了这个信息,这显然会产生不可预料的结果,所以程序员有义务编写一个安全的信号处理函数
我们首先知道了我们一些不当的操作会造成一些不可预料的错误,而且这类错误通常是很难发现的,那么我们怎么样才不会造成这些错误呢
首先我们的linux中有一些Linux保证安全的系统级函数,也就是说这些函数不会造成以上我们说的错误 那有哪些函数是安全的系统级函数呢
以上列出了Linux系统保证安全的系统级函数
我们发现其中我们的标准输入输出函数是没有办法使用的 也就是说如果我们在信号处理函数中使用了不安全的函数 就有可能发生隐式的错误
使用write函数
在这种情况下write 显然是一个十分优秀的选择 我们只需要把文件描述符换为标准输出即可
write(1,str,strlen(str));
有趣的事情发生了 strlen也不是一个异步信号安全的函数 那该怎么办呢 csapp上给出了一个自行编写的SIO(安全的I/O包) 其中包含了一些安全的输出函数 其实现就是包装了一些异步安全的函数和一些简单的字符串操作 所以我们在使用的的时候可以自行编写 也可直接调库
SIO包的使用请查看这篇文章----》SIO包是什么