c-如何为stat()函数编写函数存根

  • 本文关键字:函数 存根 stat c posix stat
  • 更新时间 :
  • 英文 :


我正试图从<sys/stat.h>。我能够用以下代码成功地为fstat做到这一点:

static int fstat_count;
static int fstat_fail_instance;
int my_fstat(const int fd, struct stat * st) {
fstat_count ++;
if (fstat_count == fstat_fail_instance) {
return EINVAL;
}
st->st_size = ST_SIZE;
return EOK;
}
#undef fstat
#define fstat my_fstat

当我试图用stat来做这件事时,我会得到这样的错误:

mkqfs_file_test.c:28:20: error: storage size of ‘sb’ isn’t known
const struct stat sb;

我相信这是因为当我做#undef stat#define stat my_stat就像我对fstat所做的那样,它是对结构stat而不是函数进行定义。知道我如何解决这个问题吗?

[…]我得到的错误如下:

mkqfs_file_test.c:28:20: error: storage size of ‘sb’ isn’t known
const struct stat sb;

我相信这是因为当我像对待fstat那样处理#undef stat#define stat my_stat时,它是在定义结构stat,而不是作用

否,#undef stat不定义任何函数或任何结构类型。它用该名称取消定义预处理器宏的任何先前定义。因此,这可能是不必要的,最坏的情况是无害的。然而,在不太可能的情况下,存在这样一个现有的宏定义,一个符合要求的程序在重新定义它之前确实需要取消定义

问题出在#define上。如果stat宏的定义在结构声明出现的位置可见,那么它将在该标识符用作结构标记的位置展开。因此,这。。。

const struct stat sb;

。。。扩展到。。。

const struct my_stat sb;

由于作用域中没有可见类型struct my_struct的定义,因此不允许使用该声明。正如编译器所说,它不知道为struct my_stat提供多少空间,也不知道它是否可用,因为编译器也不知道其任何成员是什么。请注意,这并不妨碍声明或使用指向struct my_stat的指针,但这也有其自身的问题。

任何我可以解决这个问题的想法,即只定义/重新定义作用

同样,您没有对任何函数进行定义。由于stat在不同的命名空间中用于相关目的,因此没有完全干净的方法可以使用宏来用my_stat()代替stat()。你可以做三件主要的事情:

  1. 使用类似宏的函数:

    #define stat(p,b) my_stat((p),(b))
    

    在这种情况下,必须确保不会尝试计算指向stat的指针。这可能是你最好的选择。

  2. 完全省略#undefine#define,并将替换函数命名为stat(),与原始函数相同。这依赖于链接器来选择本地定义的版本,而不是库版本,它可能会这样做。然而,这可能会产生比预期更大的影响。

  3. #undefine之前,为struct stat:声明一个typedef

    typedef struct stat struct_stat;
    #undefine stat
    #define stat my_stat
    

    然后在宏定义可见的任何地方使用typedef而不是键入struct stat

    struct_stat sb;
    

最新更新