c-如何在Linux中定义非默认返回类型的系统调用



我正在尝试定义一个遍历当前运行的所有进程的自定义系统调用。函数声明如下所示: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函数声明返回一个ssize_t。有没有任何方法可以在不使用前面提到的宏的情况下定义系统调用?

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

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

系统调用无法返回值,sizelong的大小不同。

所有平台上,您希望ssize_t的大小与long的大小相同吗?如果是(这是一个正确的预期(,那么没有理由更喜欢ssize_t而不是long。如果您不确定您的返回类型是否适合每个平台上的long,那么您就不能使用此返回类型。

例如,根据您所知道的C标准,读取函数返回ssize_t。但read系统调用的返回类型为long(使用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是系统调用的返回类型,但上述实现返回类型为ssize_t的值。

最新更新