#define _syscall0(type,name) 详解

http://blog.chinaunix.net/uid-23215128-id-2521221.html

// 以下定义系统调用嵌入式汇编宏函数。
// 不带参数的系统调用宏函数。type name(void)。
// %0 - eax(__res),%1 - eax(__NR_##name)。其中name 是系统调用的名称,与 __NR_ 组合形成上面
// 的系统调用符号常数,从而用来对系统调用表中函数指针寻址。
// 返回:如果返回值大于等于0,则返回该值,否则置出错号errno,并返回-1。
#define _syscall0(type,name) \
type name(void) \
{ \
long __res; \
__asm__ volatile ( "int $0x80" \        // 调用系统中断0x80。
:"=a" (__res) \                // 返回值??eax(__res)。
:"" (__NR_##name)); \                        // 输入为系统中断调用号__NR_name。
      if (__res >= 0) \                // 如果返回值>=0,则直接返回该值。
      return (type) __res; errno = -__res; \        // 否则置出错号,并返回-1。
      return -1;}


问题1:内联汇编Input里引号部分通常是约束部分,像“a”,"b"...这里:"" (__NR_##name)); 没有明确用什么约束是什么意思?
可以看成现在标准的:"0"(__NR_##name),这里,就相当于"a"(__NR_##name).

问题2:(__NR_##name)如果我调用 _syscall0(int,fork)替代进去不是变成__NR_##fork了吗?但系统调用常数符号的定义是#define __NR_fork 2啊,其中##是干嘛的?
##的意思就是宏中的字符直接替换,
如果name = fork,那么在宏中__NR_##name就替换成了__NR_fork了。

__NR_##name是系统调用号,##指的是两次宏展开.即用实际的系统调用名字代替"name",然后再把__NR_...展开.如name == ioctl,则为__NR_ioctl


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值