Keep Sunny
Just For Fun
    的确,和真正的程序员相比,我差得太远,但和同龄人,同水平的人来说,我还能算点什么的..

    如果不是有感来研究Linux的源码,肯定不会发现...原来,竟有这么漂亮的函数定义方式.


#define _syscall0(type,name) \
type name(
void) \
{ \
type __res; \
__asm__ 
volatile ("int $0x80" \
    : 
"=a" (__res) \
    : 
"0" (__NR_##name)); \
if (__res >= 0) \
    
return __res; \
errno 
= -__res; \
return -1; \
}

#define _syscall1(type,name,atype,a) \
type name(atype a) \
{ \
type __res; \
__asm__ 
volatile ("int $0x80" \
    : 
"=a" (__res) \
    : 
"0" (__NR_##name),"b" (a)); \
if (__res >= 0) \
    
return __res; \
errno 
= -__res; \
return -1; \
}

#define _syscall2(type,name,atype,a,btype,b) \
type name(atype a,btype b) \
{ \
type __res; \
__asm__ 
volatile ("int $0x80" \
    : 
"=a" (__res) \
    : 
"0" (__NR_##name),"b" (a),"c" (b)); \
if (__res >= 0) \
    
return __res; \
errno 
= -__res; \
return -1; \
}

#define _syscall3(type,name,atype,a,btype,b,ctype,c) \
type name(atype a,btype b,ctype c) \
{ \
type __res; \
__asm__ 
volatile ("int $0x80" \
    : 
"=a" (__res) \
    : 
"0" (__NR_##name),"b" (a),"c" (b),"d" (c)); \
if (__res<0) \
    errno
=-__res , __res = -1; \
return __res;\
}

    如果能读懂的话,应该理解是什么意思.在unistd.h文件中这几行代码,竟将67个系统函数给概括了(Linux0.01为67,0.95增加为89.)..

    我没见过多少比这更精简的代码,我只能说,我的感觉,这不能是一般的漂亮,而是精简到极致的华丽..

    ....打心底佩服Linus大侠!!


posted on 2009-06-13 12:46 Kim Leo 阅读(930) 评论(3)  编辑 收藏 引用
Comments
  • # re: 精简的华丽--读 Linux0.01 syscall系列函数有感!
    唐风
    Posted @ 2009-06-14 21:28
    确实是很精巧!!
    嗯,看来多读读高手写的代码还是很有裨益的。

    不过坦白地讲,我个人更欣赏用C++模板来实现这类似的效果(只在必要的时候辅之以宏,比如要实现(__NR_##name)或是换函数名之类的效果)。

    在Boost::lambda中也有类似的技巧,不过是宏加模板来完成。
    一般来讲,泛化类型时用模板,而要修改字符以生成不同的函数时,再加点宏的技巧。
    上面的你举的例子小改下:
    #define _syscall1(ResType, functionName, a) \ 
    template 
    <typename Arg>                     \ 
    ResType functionName(Arg a)                 \ 
    {                                           \ 
        ResType __res;                          \ 
        __asm__ 
    volatile ("int $0x80"           \ 
            : 
    "=a" (__res)                      \ 
            : 
    "0" (__NR_##functionName),"b"(a));\ 
        
    if (__res >= 0)                         \ 
        
    return __res;                           \ 
        errno 
    = -__res;                         \ 
        
    return -1;                              \ 
    }
     

    当然,Linux内核是不用C++的,所以宏是唯一的选择了~~~
      回复  更多评论   
  • # re: 精简的华丽--读 Linux0.01 syscall系列函数有感!
    KPSN
    Posted @ 2009-06-18 15:50
    @唐风
    ...貌似不错..
      回复  更多评论   
  • # re: 精简的华丽--读 Linux0.01 syscall系列函数有感!
    chen3feng
    Posted @ 2010-03-08 15:08
    别佩服 Linus,syscall 4.4BSD 里就开始这么搞了。  回复  更多评论   

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理