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