如何在 Linux 中使用非默认 return 类型定义系统调用?
How to define a system call in Linux with non-default return type?
我正在尝试定义一个遍历当前所有进程的自定义系统调用 运行。
函数声明看起来像这样:
ssize_t traverse_process(struct customStructure *list, size_t length);
我发现为了定义一个新的系统调用,我们使用了 SYSCALL_DEFINEx 宏(在我的例子中是 2)。
不过,我也看到宏其实等同于asmlinkage long sys_traverse_process(struct customStructure *list, size_t length);
。
但是,如您所见,我的 traverse_process' 函数声明 returns 一个 ssize_t。有什么方法可以不使用上述宏来定义系统调用吗?
任何帮助将不胜感激!!谢谢。
返回 long
是 Linux.
中系统调用的唯一正确方法
无法系统调用 return 一个值,size 不同于 long
.
的大小
您希望 ssize_t
在 所有平台 上的大小与 long
相同吗?如果是(这是一个正确的期望),那么就没有理由比 long
更喜欢 ssize_t
。如果您不确定您的 return 类型是否适合每个平台上的 long
,那么您根本无法使用此 return 类型。
例如,从你知道的 C 标准中,read function returns ssize_t
. But read
system call has long
as return type (it is defined 使用 DEFINE_SYSCALL
宏):
SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count)
{
struct fd f = fdget(fd);
ssize_t ret = -EBADF;
if (f.file) {
loff_t pos = file_pos_read(f.file);
ret = vfs_read(f.file, buf, count, &pos);
file_pos_write(f.file, pos);
fdput(f);
}
return ret;
}
请注意,尽管 long
是 return 类型的系统调用,但上述实现 return 是 ssize_t
.
类型的值
我正在尝试定义一个遍历当前所有进程的自定义系统调用 运行。
函数声明看起来像这样:
ssize_t traverse_process(struct customStructure *list, size_t length);
我发现为了定义一个新的系统调用,我们使用了 SYSCALL_DEFINEx 宏(在我的例子中是 2)。
不过,我也看到宏其实等同于asmlinkage long sys_traverse_process(struct customStructure *list, size_t length);
。
但是,如您所见,我的 traverse_process' 函数声明 returns 一个 ssize_t。有什么方法可以不使用上述宏来定义系统调用吗?
任何帮助将不胜感激!!谢谢。
返回 long
是 Linux.
无法系统调用 return 一个值,size 不同于 long
.
您希望 ssize_t
在 所有平台 上的大小与 long
相同吗?如果是(这是一个正确的期望),那么就没有理由比 long
更喜欢 ssize_t
。如果您不确定您的 return 类型是否适合每个平台上的 long
,那么您根本无法使用此 return 类型。
例如,从你知道的 C 标准中,read function returns ssize_t
. But read
system call has long
as return type (it is defined 使用 DEFINE_SYSCALL
宏):
SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count)
{
struct fd f = fdget(fd);
ssize_t ret = -EBADF;
if (f.file) {
loff_t pos = file_pos_read(f.file);
ret = vfs_read(f.file, buf, count, &pos);
file_pos_write(f.file, pos);
fdput(f);
}
return ret;
}
请注意,尽管 long
是 return 类型的系统调用,但上述实现 return 是 ssize_t
.