为什么某些系统调用将结构的指针作为参数?如果这些结构是在内核中定义的,那么用户程序如何创建它们的实例?
这里没有魔法。 系统调用中使用的结构类型以及用户可创建的结构类型在头文件中声明,就像系统调用本身一样。 取统计数据(2):
int stat(const char *path, struct stat *buf);
您可以通过包含 sys/stat.h
来获得struct stat
(在 Linux 上)的声明。
但是,某些类型不应由客户端代码直接声明。 在评论中,您提到了信号量,sem_t
就是一个例子。 用户标头仅提供不完整的声明,因此无法直接创建实例。 这是故意的。 在这些情况下,将有一个调用创建一个实例并返回指向该实例的指针,例如:
sem_t *sem_open(const char *name, int oflag);
您应该提供相同的指针作为后续系统调用的参数,即使您自己无法取消引用它(因为它的声明不完整)。 结构和结构指针之间的区别在这里非常重要。
每次,当你在内核内创建一个新结构时,可以通过执行"make headers_install"将其导出到用户空间。
因此,如果用户空间二进制文件是在同一台机器上构建的,它将具有相同的头文件副本(通常在/usr/include 中)。因此,系统调用可以将指向结构的指针指定为参数。