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
宏):
注意,尽管onlong
是系统调用的返回类型,但上述实现返回的值类型为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;
}