日期:2014-05-16  浏览次数:20654 次

关于被信号打断的函数的执行。
1。如果是用户函数,是否执行完信号处理函数后,又接着处理用户函数,好像完全没被打断过一样。而要重新执行的都是系统调用?



2。 关于系统调用,如果系统调用被打断后重新执行,是否被打断的那个调用可以像数据库事务一样回到调用之前的状态 ,不然的话malloc等函数里的系统调用被打断后,如果没回到以前的状态,那再执行这个系统调用应该就会出现类似于在信号处理函数里调用不可重入函数的情况吧

------解决方案--------------------
信号的执行是以软中断方式执行的。目前,大多数linux系统中,系统调用被信号打断之后,都是自动重启的而用户程序,则接受到信号后,默认是不重启的,也就是接受到信号之后,默认是停止用户函数。
------解决方案--------------------
signal函数,是否重启被中断的系统调用由操作系统的具体实现决定,
sigaction函数,应用程序可以控制是否重启被中断的系统调用。
------解决方案--------------------
Linux下我没有试验过,然是在FreeBSD和AIX5.3 上 SA_RESTART 确实起作用。
探讨

sigaction的restart参数好用吗?

我的映像是linux系统设置了该选项也不能实际起作用的。
没试过,不确定。
引用:
signal函数,是否重启被中断的系统调用由操作系统的具体实现决定,
sigaction函数,应用程序可以控制是否重启被中断的系统调用。