易截截图软件、单文件、免安装、纯绿色、仅160KB

linux api笔记(7):系统调用如何摆脱信号的干扰

在linux环境下编程有一个很让人头疼的问题就是信号对系统调用的干扰,在系统调用过程中如果受到信号的干扰,
部分系统调用会将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下解压压缩及打包命令大全


Linux下解压压缩及打包命令大全
[日期:2008-11-04]
来源:  作者:jenen
 
———————————————
.tar
解包:tar xvf FileName.tar
打包:tar cvf FileName.tar DirName
(注:tar是打包,不是压缩!)
&mdas ......

关于Linux的视频编程(v4l2编程)(转)


前言:目前正在忙于ARM平台的Linux应用程序的开发(其实是刚刚起步学习啦)。底层的东西不用考虑了,开发板子提供了NAND Bootloader,和Linux 2.6的源码,而且都编译好了。自己编译的bootloader可以用,但是Linux编译后,文件很大,暂且就用人家编译的系统,先专心写应用程序 吧。。
正文:要做的任务是,把一块板子上的 ......

嵌入式Linux系统CGI程序设计技术

嵌入式Linux系统CGI程序设计技术
摘要:在详细介绍一种嵌入式Web服务器BOA的实现与配置方法的基础上,以一个Web在线远程监控GPIO(通用输入/输出)的程序为实例,介绍嵌入式Linux系统下CPU程序设计技术。
   关键词:嵌入式系统Linux BOA CGI GPIO
1 概述
随着互联网应用的普及,越来越多的信息化产品需要接 ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号