易截截图软件、单文件、免安装、纯绿色、仅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 makefile 教程 非常详细,且易懂

 最近在学习Linux下的C编程,买了一本叫《Linux环境下的C编程指南》读到makefile就越看越迷糊,可能是我的理解能不行。
            于是google到了以下这篇文章。通俗易懂。然后把它贴出来,方便学习。
        & ......

Linux下 zip 和 unzip的用法

     zip命令的基本用法是:zip [参数] [文件1] [文件2]
      简单的例子:
      把本目录下的test文件打包成test.zip文件:zip test.zip test/* ,如果在文件中用绝对的路径,那么在压缩文件中也是绝对路径。就是说,如果你 zip test.zip /hom ......

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

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

Linux内核进程调度以及定时器实现机制(转)

摘要】本文简单介绍了任务的各种状态和PCB的结构,分析了几种任务调度策略,详解了schedule,并分析了如何进行进程上下文切换;随后分析了2.6内核如何优化了任务调度算法;最后介绍了内核定时器的实现机制和系统调用的实现过程。
【关键词】进程控制块PCB,RR,FIFO,内核调度算法,任务切换,内核定时,timer,软中断soft ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号