linux-kernel – 将参数传递给自定义系统调用

我开发了一个自定义系统调用来记录被杀死的进程C程序终止进程并调用自定义系统调用,传递被杀死进程的进程ID,然后系统调用将已杀死进程的ID打印到内核的日志中.在这里,我只是传递一个假人来测试系统调用是否写入内核日志.系统调用表中的系统调用号是329.

以下是我的系统调用

#include <linux/kernel.h>


asmlinkage long sys_killa(char* proc_id)
{

    printk("The process %s has been killed", proc_id);

    return 0;
}

这是我调用自定义系统调用的C程序.

#include <stdio.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <unistd.h>

int main()
{
    char proc_id[5] = "3219";
    long int sys = syscall(329, proc_id);
    printf("System call sys_killa returned %ld\n", sys);
    return 0;
}

运行C程序只需在终端中打印“Killed”.再次运行程序会导致我的虚拟机崩溃.使用dmesg实用程序检查时,内核日志中没有打印出任何内容.我究竟做错了什么?

最佳答案 需要使用pid_t变量而不是String.This是修改后的系统调用:

#include <linux/kernel.h>

asmlinkage long sys_killa(pid_t pid)
{
    long pid_l = (long) pid;

    printk("The process %ld has been killed", pid_l);

    return 0;

}

这是使用系统调用的修改过的C代码:

#include <stdio.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <unistd.h>

int main()
{
    pid_t pid = 3249;
    long int sys = syscall(329, pid);
    printf("System call sys_killa returned %ld\n", sys);
    return 0;
}
点赞