易截截图软件、单文件、免安装、纯绿色、仅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下 zip 和 unzip的用法

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

linux链接文件

 链接文件有点类似于Windows 的所谓快捷方式,但并不完全一样。链接有两种方式,软链接和硬链接。
  软链接文件
  软链接又叫符号链接,这个文件包含了另一个文件的路径名。可以是任意文件或目录,可以链接不同文件系统的文件。链接文件甚至可以链接不存在的文件,这就产生一般称之为"断链"的问题(或曰“现 ......

linux之间一些差别

redhat系列(rhel,centos,fc) yum install package-name
debian系列(debian,ubuntu)  apt-get install package-name
对于开发包
redhat:  yum install python-devel
debian:  apt-get install python-dev
添加用户
redhat:  useradd user-name
debian:  useradd -m user-name
debian系列里 ......

想起来的一些关于linux的一些知识

软实时和硬实时,软实时是说违反了程序执行的deadline也不会有致命的错误,而硬实时的deadline是写死的。
很多linux有硬实时的补丁,如MontaVista。
有源晶振和无源晶振,有源的叫osllicator,无源的叫crystal。
 uclinux是静态编译的,没有mmu机制。
x86的要选xterm...
serveu假设服务器 + linux用sftp(通过ssh ......

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

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