Linux kernel 具有结构参数的系统调用(Linux)

Linux kernel 具有结构参数的系统调用(Linux),linux-kernel,system-calls,Linux Kernel,System Calls,某些系统调用如何将指向结构的指针作为参数?如果这些结构是在内核中定义的,那么用户程序如何创建它们的实例呢。在系统调用中使用的、可由用户创建的结构类型在头文件中声明,就像系统调用本身一样。以统计数据(2)为例: 通过包含sys/stat.h,可以获得struct stat(在Linux上)的声明 然而,有些类型并不意味着由客户机代码直接声明。在您的评论中提到了信号量,sem\t就是这样一个例子。用户头只提供不完整的声明,因此不能直接创建实例。这是故意的。在这些情况下,将有一个创建实例并返回指向该实

某些系统调用如何将指向结构的指针作为参数?如果这些结构是在内核中定义的,那么用户程序如何创建它们的实例呢。在系统调用中使用的、可由用户创建的结构类型在头文件中声明,就像系统调用本身一样。以统计数据(2)为例:

通过包含
sys/stat.h
,可以获得
struct stat
(在Linux上)的声明

然而,有些类型并不意味着由客户机代码直接声明。在您的评论中提到了信号量,
sem\t
就是这样一个例子。用户头只提供不完整的声明,因此不能直接创建实例。这是故意的。在这些情况下,将有一个创建实例并返回指向该实例的指针的调用,例如:

   sem_t *sem_open(const char *name, int oflag);

即使您自己无法取消引用该指针(因为其声明不完整),也希望您提供该指针作为后续系统调用的参数。结构和结构指针之间的区别在这里非常重要。

每次在内核中创建新结构时,都可以通过执行“make headers\u install”将其导出到用户空间


因此,如果用户空间二进制文件构建在同一台计算机中,它将具有相同的头文件副本(通常在/usr/include中)。因此,系统调用可以将指向结构的指针指定为参数。

什么系统调用采用结构参数?我可以想出几个指向结构的指针,但没有一个指向实际的结构。好吧,指向结构的指针。这并没有改变我的问题。系统调用的手册页会告诉你应该包含哪些标题,以及它们的相对顺序。我明白了。那么,这是内核中stat结构的重新定义吗?如果是这样的话,有没有可能使用更复杂的结构,比如使用内核中定义的其他结构的信号量?我不理解你对“内核内部”的执着
struct stat
是内核使用的数据类型,是的。头文件中提供了它的声明,以便用户可以解释该类型的值并声明自己的实例。该类型的复杂性实际上并不相关。编辑该类型是为了描述不透明指针的使用,正如某些系统调用所涉及的那样。
   sem_t *sem_open(const char *name, int oflag);