未定义的系统调用如何返回-1?

我在我的 Linux内核中定义了一个’helloworld’系统调用并重新编译它.系统调用的代码是:

#include<linux/kernel.h>
#include<linux/init.h>
#include<linux/sched.h>
#include<linux/syscalls.h>
#include "processInfo.h"
asmlinkage long sys_listProcessInfo(void)
{
    printk("Hello World. My new syscall..FOSS Lab!\n");
    return 0;
}

但是,当我使用下面的代码从同一操作系统调用此系统调用时,使用另一个不包含此系统调用的内核版本:

#include<stdio.h>
#include<linux/kernel.h>
#include<sys/syscall.h>
#include<unistd.h>
int main()
{
    long int var = syscall(326);
    printf("Returning: %ld\n",var);
    return 0;
}

变量var得到值-1.我想知道var如何获得-1而不是显示错误.

最佳答案 你为什么期待错误? syscall函数存在,链接器可以解析它.因此编译器或链接器不会出错.

当您运行可执行文件时,旧内核的syscall函数检测到326是无效的系统调用号,函数返回-1,可能是将errno设置为ENOSYS =未实现系统调用.

点赞