C 如何在Linux中使用非默认返回类型定义系统调用?

C 如何在Linux中使用非默认返回类型定义系统调用?,c,linux,macros,kernel,system-calls,C,Linux,Macros,Kernel,System Calls,我试图定义一个自定义的系统调用,它遍历当前运行的所有进程。 函数声明如下所示: ssize\u t traverse\u进程(struct customStructure*list,size\u t length) 我发现为了定义一个新的系统调用,我们使用SYSCALL\u DEFINEx宏(在我的例子2中) 然而,我也读到宏实际上相当于asmlong sys\u transverse\u进程(struct customStructure*list,size\t length) 但是,正如您所看

我试图定义一个自定义的系统调用,它遍历当前运行的所有进程。 函数声明如下所示:
ssize\u t traverse\u进程(struct customStructure*list,size\u t length)

我发现为了定义一个新的系统调用,我们使用SYSCALL\u DEFINEx宏(在我的例子2中)

然而,我也读到宏实际上相当于
asmlong sys\u transverse\u进程(struct customStructure*list,size\t length)

但是,正如您所看到的,我的traverse_进程的函数声明返回一个ssize_t。有没有办法不用前面提到的宏来定义系统调用


任何帮助都将不胜感激!!谢谢。

返回
long
是Linux系统调用的唯一正确方法

系统调用无法返回与
long
大小不同的值

您是否希望
ssize\t
所有平台上具有与
long
相同的大小?如果是(这是一个正确的期望),那么没有理由选择
ssize\u t
而不是
long
。如果您不确定您的返回类型是否适合每个平台上的
long
,那么您就不能使用此返回类型

例如,从您知道的C标准中,该函数返回
ssize\u t
。但是
read
系统调用将
long
作为返回类型(它使用
DEFINE\u SYSCALL
宏):


注意,尽管on
long
是系统调用的返回类型,但上述实现返回的值类型为
ssize\t

只是一个建议;如果可能,请添加一个
ioctl()
。您可以考虑将其添加到处理程序的根>代码> /进程/代码>文件系统中。
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;
}