今天编译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的对应代码如下:
直接调用这个函数固然省事,但是相比以前的_syscallx宏来说少了C的参数类型检查,可能比较容易犯错,并且后续代码的维护工作可能没有以前的简单,以前完全可以用_syscallx宏定义一个和系统调用同名的函数,并且如果以后C库支持了这个系统调用,只需删除相应代码即可。但这并不意味着syscall不能实现这些,不过没有以前的直接罢了。还是用getpid()作例子:
pid_t getpid(void)
{
return (pid_t)syscall(SYS_getpid);
}
|
看起来还不错,毕竟聊生于无!
阅读(1708) | 评论(0) | 转发(0) |