Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2034290
  • 博文数量: 369
  • 博客积分: 10093
  • 博客等级: 上将
  • 技术积分: 4271
  • 用 户 组: 普通用户
  • 注册时间: 2005-03-21 00:59
文章分类

全部博文(369)

文章存档

2013年(1)

2011年(2)

2010年(10)

2009年(16)

2008年(33)

2007年(146)

2006年(160)

2005年(1)

分类: LINUX

2007-11-09 23:48:13

今天编译util-linux的时候,发现以前的_syscallx(其中x表示系统调用的参数的个数)宏已经不复存在:

#define _syscall0(type,name) \
type name(void) \
{ \
long __res; \
__asm__ volatile ("int $0x80" \
    : "=a" (__res) \
    : "0" (__NR_##name)); \
__syscall_return(type,__res); \
}
...


很彻底地从系统上消失了,哪里都找不见!

它们可是为那些Linux内核已经支持,但是系统C库还没有支持的系统调用准备的。如果它们消失了,以后遇到此类情况那可如何是好?

grep, google了个遍,最终还是被我找到了替代品:

     #include <sys/syscall.h>
     #include <unistd.h>

     int syscall(int number, ...);


虽然这个系统调用是4.0BSD首先实现的,并不遵循任何UNIX标准,但是存在了就是事实标准,并且Linux也是支持的,这对于与我类似的Linux Only Guy来说,就是标准!

这个函数使用起来也比较简单,例如你想调用getpid(),那么syscall的对应代码如下:

syscall(SYS_getpid)


直接调用这个函数固然省事,但是相比以前的_syscallx宏来说少了C的参数类型检查,可能比较容易犯错,并且后续代码的维护工作可能没有以前的简单,以前完全可以用_syscallx宏定义一个和系统调用同名的函数,并且如果以后C库支持了这个系统调用,只需删除相应代码即可。但这并不意味着syscall不能实现这些,不过没有以前的直接罢了。还是用getpid()作例子:

pid_t getpid(void)
{
    return (pid_t)syscall(SYS_getpid);
}


看起来还不错,毕竟聊生于无!
阅读(1686) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~