使用struct参数进行系统调用(Linux)

时间:2014-12-08 19:27:17

标签: linux-kernel system-calls

某些系统调用如何将结构指针作为参数?如果在内核中定义了这些结构,那么用户程序如何创建它们的实例呢?

2 个答案:

答案 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系统调用可以指定结构指针作为参数。