glibc源码分析之系统调用(二)

本文深入探讨了在glibc中如何使用.c文件封装系统调用,如stat和brk。通过举例说明,解释了封装的原因:一是为了替换过时的系统调用,二是改变调用的语义。文章详细分析了stat系统调用的封装过程,包括错误处理、调用stat64以及数据类型的转换。此外,还提到了封装系统调用的INTERNAL_SYSCALL宏及其针对不同参数数量的处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前文已经向大家介绍了用脚本封装系统调用的方法。在本文中,我将向大家介绍使用.c文件封装系统调用的方法。

使用.c文件封装系统调用一般出于以下两个原因:一,系统调用已过时,可以使用新的系统调用替换旧的系统调用。系统调用的语义不变。二,封装后的函数改变了系统调用的语义。

stat系统调用的封装便是原因一的一个例子。

stat系统调用是106号系统调用。使用stat系统调用可以获取文件的属性,但是获取的属性值都是32位的,这对于现在的64位文件系统来说是有问题的。所以linux又定义了stat64系统调用,用于获取64位文件属性。所以,Linux内核中关于stat的系统调用有两个,且stat64系统调用可以替换stat系统调用。而在glibc中,stat系统调用也是使用stat64来封装的。

让我们观察stat系统调用的封装代码:

#undef stat
int
attribute_hidden
__stat (const char *file, struct stat *buf)
{
  return __xstat (_STAT_VER, file, buf);
}

weak_hidden_alias (__stat, stat)

stat函数调用了__xstat函数完成函数的封装。

int
__xstat (int vers, const char *name, struct stat *buf)
{
  int result;

  if (vers == _STAT_VER_KERNEL)
    return INLINE_SYSCALL (stat, 2, name, buf);

  {
    struct stat64 buf64;

    INTERNAL_SYSCALL_DECL (err);
    result = INTERNAL_SYSCALL (stat64, err, 2, name, &buf64);
    if (__glibc_unlikely (INTERNAL_SYSCALL_ERROR_P (result, err)))
      return INLINE_SYSCALL_ERROR_RETURN_VALUE (INTERNAL_SYSCALL_ERRNO (result,
                                    err));
    else
      return __xstat32_conv (vers, &buf64, buf);
  }
}
#undef INTERNAL_SYSCALL_DECL
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值