易截截图软件、单文件、免安装、纯绿色、仅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篇(一)

最近准备学习一下操作系统原理,于是照例记录一些重要的东西。
1. 操作系统的功能
    从资源管理的角度来看,操作系统的功能一般分为5种:
    1.1 存储管理
          存储管理就是管理计算机有限的内存空间,包括:存储分配、存储安全和 ......

【Linux学习笔记】 常用命令1

格式:ls [options] [filename]
作用:显示目录内容,类似dos的dir
常用参数:
   -a 不隐藏任何以"."字符开始的文件
   -l 使用较长的格式显示信息
   -r 按照文件名的逆序打印输出
   -F 加上文件类型的指示符
格式:cat [options] [filename]
作用:显示文件的内容,是concat ......

linux 安装Kmplayer播放器


安装Kmplayer播放器
(作者/l4nneret)为了能在 Linux 下也能播放多媒体文件,于是安装据称很强悍的 Kmplayer 播放器。过程如下:在 http://www.mplayerhq.hu/MPlayer/ 这里看到 Kmplayer 的主程序已经更新到了 1.0rc2 版。
下载主程序:MPlayer-1.0rc2.tar.bz2
两个解码包:all-20071007.tar.bz2 和 windows-all-2007 ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号