如何在 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.

类型的值