linux api笔记(7):系统调用如何摆脱信号的干扰
2010-04-19 16:11
417 查看
在linux环境下编程有一个很让人头疼的问题就是信号对系统调用的干扰,在系统调用过程中如果受到信号的干扰,
部分系统调用会将errno设置成EINTR,我们不得不编写下面的错误处理代码来防止这种情况的发生:
一次又一次的编写的话真的很烦,而前端时间我在chrome的源代码中找到的一段代码正好解决了这种丑陋的编码:
当然我们也不是只要碰到系统调用就使用HANDLE_EINTR,一个系统调用函数至少要满足两个条件的时候才能使用:
1)返回值类型为int
2)会受到信号的干扰,也就是说有可能将errno设置成EINTR(这就需要我们查man手册了)。上面的open函数就
不会受到信号的干扰,所以就不能使用这个宏。
至少到目前为止,我发现凡是能够将errno设置成EINTR的系统函数的返回值类型都是int,并且当出错的时候
返回值小于0。
部分系统调用会将errno设置成EINTR,我们不得不编写下面的错误处理代码来防止这种情况的发生:
syscall: int ret = syscall(...); if (ret < 0 && EINTER == errno) goto syscall; else if(ret < 0) ... else ...
一次又一次的编写的话真的很烦,而前端时间我在chrome的源代码中找到的一段代码正好解决了这种丑陋的编码:
#include <fcntl.h> #include <errno.h> #include <unistd.h> #define HANDLE_EINTR(x) ({ / typeof(x) __eintr_code__; / do { / __eintr_code__ = x; / } while(__eintr_code__ < 0 && EINTR == errno); / __eintr_code__; / }) int main() { int fd = 0; char buf[1024]; fd = open("hello world", O_RDWR); HANDLE_EINTR(read(fd,buf, sizeof(buf))); close(fd); return 0; }
当然我们也不是只要碰到系统调用就使用HANDLE_EINTR,一个系统调用函数至少要满足两个条件的时候才能使用:
1)返回值类型为int
2)会受到信号的干扰,也就是说有可能将errno设置成EINTR(这就需要我们查man手册了)。上面的open函数就
不会受到信号的干扰,所以就不能使用这个宏。
至少到目前为止,我发现凡是能够将errno设置成EINTR的系统函数的返回值类型都是int,并且当出错的时候
返回值小于0。
相关文章推荐
- Linux系统调用是如何被信号终止的
- Unix编程学习笔记--------系统调用的疑问????? 到底什么是系统调用???? 系统调用是如何实现的???
- Unix编程笔记疑问篇----如何从指令运行的角度去看待系统调用???
- 阅读笔记:如何给OpenSolaris增加一个系统调用
- 使用如何ubuntu 的root帐户登录系统(笔记)
- 被调用的linux系统函数system的是如何实现的!
- python笔记之调用系统命令
- 如何mock系统调用
- linux信号处理 --和信号相关的几个系统调用
- [文件系统]文件系统学习笔记(五)---mount系统调用(1)
- (转)IOS 学习笔记 2015-03-23 如何获取IOS程序的系统信息
- linux 系统调用会被信号打断的
- Android开发_如何调用系统默认浏览器访问
- (三十二)工具方法:如何判断是否有网络/如何调用系统设置界面
- Linux下select()系统调用笔记
- <笔记-Unix系统编程1>系统调用
- 信号中断 与 慢系统调用
- 调用其他系统http接口超时了,如何处理,方案汇总
- 如何调用linux系统调用
- Linux内核学习笔记之中断与系统调用(七)