copy_from_user() 的任何示例吗?内核和用户空间

2023-12-01

我正在寻找将 PID 值从用户空间复制到内核空间,这是我的代码快照。

内核模块:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <asm/siginfo.h>
#include <linux/rcupdate.h>
#include <linux/sched.h>
#include <linux/uaccess.h>
#include <linux/signal.h>

MODULE_LICENSE ("GPL");

struct siginfo sinfo;
pid_t pid;
struct task_struct *task;

int init_module() 
{
    memset(&sinfo, 0, sizeof(struct siginfo));
    sinfo.si_signo = SIGIO;
    sinfo.si_code = SI_USER;
    pid = 5218; // Everytime a new PID 
    // task = find_task_by_vpid(pid); I am also working on new and old version of UBUNTU so thats why this is here
    task = pid_task(find_vpid(pid), PIDTYPE_PID); 
    printk("%d .\n", task);

    if(task == NULL) {
        printk("Cannot find PID from user program\r\n");
        return 0;
    }

    send_sig_info(SIGIO, &sinfo, task);
    return 0;
}
void cleanup_module () 
{
    printk(KERN_ALERT"\nGoodBye World\n\n");
}

用户空间代码:

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>

void signal_handler(int signum)
{
    if (signum == SIGIO) printf("SIGIO\r\n"); return;
}

int main()
{
    int i = 1;
    signal(SIGIO, signal_handler);
    printf("My PID is %d.\n", getpid());
    
    while (i);
    return 0;
}

现在,我总是在这里运行用户空间程序来获取 PID,然后我总是必须在内核模块中编辑 pid 变量。

我找到了一种从用户空间访问信息到内核空间的方法,反之亦然(即使用copy_from/to_user() )

但我无法理解它们中的任何一个从用户空间获取 PID,我必须在其中创建文件/dev目录并且应该应用所有必需的函数来获取 PID?

还有其他办法吗?如果没有,那么有人可以帮我做到这一点吗?我是 C 编程新手,直接使用内核模块,所以这对我来说很难。


查看您给出的代码,似乎您想要处理SIGIO signal

这是我尝试解决您的问题,

signal_kernel.c file :

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <asm/siginfo.h>
#include <linux/rcupdate.h>
#include <linux/sched.h>
#include <linux/uaccess.h>
#include <linux/signal.h>
#include <linux/debugfs.h>
#include <linux/pid.h>

#define MAX 10

MODULE_LICENSE("GPL");

struct dentry *file;

static ssize_t write_conf_pid(struct file *file, const char *buf,
            size_t count, loff_t *position)
{
    char temp_str[MAX];
    int ret;
    int pid = 0;
    struct siginfo sinfo;
    struct task_struct *task;

    /* NEVER TRUST USER INPUT */
    if (count > MAX)
        return -EINVAL;

    if (copy_from_user(temp_str, buf, MAX) != 0)
        return -EFAULT;

    ret = sscanf(temp_str, "%d", &pid);
    if (ret != 1) {
        pr_info("Error in reading PID value from user");
        return -EINVAL;
    }

    pr_info("User entered pid %d\n", pid);
    memset(&sinfo, 0, sizeof(struct siginfo));
    sinfo.si_signo = SIGIO;
    sinfo.si_code = SI_USER;
    task = pid_task(find_vpid(pid), PIDTYPE_PID);
    if (task == NULL) {
        pr_info("Cannot find PID from user program\r\n");
        return -ENODEV;
    }
    ret = send_sig_info(SIGIO, &sinfo, task);
    if (ret < 0)
        pr_info("Error sending signal\n");
    return count;
}

static const struct file_operations my_fops = {
    .write = write_conf_pid,
};

int init_module()
{
    /* Only root can write to this file */
    file = debugfs_create_file("pidconf", 0200, NULL, NULL, &my_fops);
    return 0;
}

void cleanup_module()
{
    pr_info("\nGoodBye World\n\n");
}

signal_user.c file :

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>

void signal_handler(int signum)
{
    if (signum == SIGIO)
        printf("SIGIO\r\n");
    return;
}

int main()
{
    int i = 1;
    signal(SIGIO, signal_handler);
    printf("My PID is %d.\n", getpid());
    while (i);
    return 0;
}

编译并运行用户空间和内核空间程序后,使用debugfs将PID值发送到内核空间的接口,

$ insmod signal_kernel.ko
$ ./signal_user 
My PID is 17633.

... # Process will run in loop due to while(1)

从另一个终端,提供 PIDdebugfs界面,

$ echo 17633 > /sys/kernel/debug/pidconf

有多种方法(sysfs, misc_char_device, char device等)来完成此任务,但这将为您提供有关使用的简要想法copy_from_user() and copy_to_user()

请注意,几乎没有进行错误处理signal_user.c and signal_kernel.c.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

copy_from_user() 的任何示例吗?内核和用户空间 的相关文章

  • 有没有办法分析 WCF 应用程序的性能?

    我们正在尝试测量我们的系统的性能 该系统是一个使用 WCF 调用的 NET 3 5 应用程序 问题是到目前为止 我们无法分析这些调用中的方法 编写了一个 winforms 客户端应用程序来测试我们的系统 我们尝试使用ANTS 4 Profi
  • 如何拦截 .Net 中第三方库对非虚拟方法的调用?

    我认为我需要的是 net 人们称之为 透明动态代理 的东西 但到目前为止我所看到的所有实现 Castle DynamicProxy Spring NET AOP 等 都要求我至少执行以下操作之一 将拦截的方法声明为虚拟方法 包装类并创建包装
  • 每个 CPU 核心处于 C0 电源状态的时间

    任何帮助弄清楚如何做到这一点都会很棒 在过去一秒内 每个 CPU 核心处于 C0 电源状态的时间有多少 这是针对 Mac 应用程序的 因此需要 Objective C cocoa 和 c OS X 没有任何公开 CPU c 状态的 API
  • 如何将 pem 公钥转换为 openssl RSA* 结构

    假设我必须像这样公开 pem 密钥 BEGIN PUBLIC KEY MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7vbqajDw4o6gJy8UtmIbkcpnk O3Kwc4qsEnSZp TR fQi
  • VBA 中的 VSTO:AddIn.Object 有时不返回任何内容 (null)

    Given VSTO 插件 An override object RequestComAddInAutomationService 它返回一个名为的类的实例Facade在我的场景中 Excel 2007 中的 VBA 宏可访问AddIn O
  • 如何使用Task.WhenAny并实现重试

    我有一个创建多个基于 I O 的任务的解决方案 我正在使用Task WhenAny 来管理这些任务 但通常许多任务会由于网络问题或请求限制等原因而失败 我似乎找不到一个解决方案 使我能够在使用时成功重试失败的任务Task WhenAny 方
  • ApiController 操作无法从查询字符串解析数组

    使用 Visual Studio 2012 2 MVC4 Web 应用程序 我有请求发送到我的 ApiController 如下所示 http localhost api keys ids 1 ids 2 ids 3 我的印象是以下方法应该
  • 无法使用 ASP.NET Core 从 JWT 令牌获取声明

    我正在尝试使用 ASP NET Core 实现 JWT 持有者身份验证的非常简单的实现 我从控制器返回的响应有点像这样 var identity new ClaimsIdentity identity AddClaim new Claim
  • C# - 如何将 IntPtr 缓冲区数据保存到文件(最快的方法)?

    我使用此代码将非托管代码中的 IntPtr 缓冲区中的字节保存到文件中 这是一个简单的回调函数 private void callback IntPtr buffer int length byte bytes new byte lengt
  • 平衡两轮机器人而不使其向前/向后漂移

    我正在尝试设计一个控制器来平衡 2 轮机器人 约 13 公斤 并使其能够抵抗外力 例如 如果有人踢它 它不应该掉落 也不应该无限期地向前 向后漂移 我对大多数控制技术 LQR 滑模控制 PID 等 都很有经验 但我在网上看到大多数人使用 L
  • Boost async_write问题

    我将展示一些代码 void wh const boost system error code ec std size t bytes transferred std cout lt lt test int main int argc cha
  • 使用 cryptoapi CryptImportKey 导入公钥时出错

    我想将公钥 blob 导入到 CSP 但发生了错误 BYTE pbData 0xEB 0x2A 0x38 0x56 0x86 0x61 0x88 0x7F 0xA1 0x80 0xBD 0xDB 0x5C 0xAB 0xD5 0xF2 0x
  • 读取所有进程内存以查找字符串变量c#的地址

    我有 2 个用 C 编写的程序 第一个名为 ScanMe 的程序包含一个包含值 FINDMEEEEEEE 的字符串变量 以及一个值为 1546 22915487 的双精度变量 另一个名为 MemoryScan 的程序读取第一个程序的所有内存
  • 如何在 Xamarin.Mac 中执行终端命令并读入其输出

    我们正在编写一个 Xamarin Mac 应用程序 我们需要执行像 uptime 这样的命令 并将其输出读取到应用程序中进行解析 这可以做到吗 在 Swift 和 Objective C 中都有 NTask 但我似乎无法在 C 中找到任何示
  • 修改公共属性的访问修饰符是否是重大更改?

    如果我将公共属性的 setter 的访问修饰符从私有更改为公共 是否会导致引用它的其他程序集发生任何重大更改 UPDATE 这个问题是我 2012 年 1 月博客的主题 https ericlippert com 2012 01 09 ev
  • jquery ajax“发布”调用

    我是 jQuery 和 Ajax 的新手 并且在 发布 方面遇到问题 我正在使用 jQuery Ajax post 调用将数据保存到数据库 当我尝试保存数据时 它将 null 传递给我的 C 方法 jQuery 看起来像这样 functio
  • 当另一个进程使用 std::fstream 写入文件时从文件读取[重复]

    这个问题在这里已经有答案了 我需要从文件中逐行读取 它是由 std getline 完成的 另一个进程的问题是一直向其附加数据 然后我需要读取新行 例如 文件一开始包含10行 我的程序读取了10行 那么我的程序应该等待 过了一会儿 另一个进
  • 如果未返回,则在一段时间后终止线程

    我有一个线程从网络或串行端口获取一些数据 如果 5 秒内没有收到数据 则线程必须终止 或返回 false 换句话说 如果线程运行时间超过 5 秒 则必须停止 我用 C 编写 但任何 NET 语言都可以 有两种方法 1 封装超时 从网络或串行
  • 在 WPF 树视图中获取 FullPath?

    如果我以编程方式创建 WPF TreeView 例如 TreeView treeView lt added in the designer TreeViewItem rootNode new TreeViewItem rootNode He
  • C++20 范围太多 |运营商?

    我在这段代码中使用 g 10 2 有谁知道为什么我最后收到编译器错误std views reverse on results3 include

随机推荐

  • 无法让 PhpStorm 连接到在 WSL 2 中运行的 Xdebug

    我在使用以下设置让 PhpStorm 2020 2 与 xdebug 一起使用时遇到问题 WSL2 运行 Ubuntu 20 安装了 PHP 和 php xdebug 每当我在启用调试的情况下运行测试时 它都会显示 未建立连接 这是 Xde
  • 如何将 String^ 转换为 char 数组 [重复]

    这个问题在这里已经有答案了 可能的重复 需要将 String 转换为 char 我一直在寻找这个解决方案 但我找不到任何具体的东西 我在 Visual Studio C Windows 窗体应用程序中工作 我需要转换String 值存入 c
  • 给定 DataTable 时 Google Charts draw() 方法类型错误

    我试图使用 HTML 和 Javascript 在 Google Charts 中显示带有范围过滤器的折线图 但是每当我运行draw 函数 代码告诉我我使用了错误的数据类型draw 参数 它应该是一个DataTable 然而 我使用构建我的
  • 当管道中的一个进程失败时退出

    目标是制作一个简单的非侵入式包装器 将 stdin 和 stdout 跟踪到 stderr bin bash tee dev stderr script sh tee dev stderr exit PIPESTATUS 1 测试脚本scr
  • Zurb 基金会 SASS 变量

    我正在使用 Zurb 的 Foundation 框架 我想知道如何编辑 SASS 变量的默认值 我在互联网上进行了搜索 但找不到任何可以帮助我的东西 请检查本文档在他们的网站上 Under Available SCSS Variables部
  • Python 3.8 不加载 C dll

    升级到 Python 3 8 1 后 我的工作代码崩溃了 以下行曾经有效 但现在返回错误消息 cdll LoadLibrary mydllpath mydll dll gt Could not find module mydll dll T
  • 在其他 PHP 类中使用 PDO 数据库类

    我有一个使用 PDO 的数据库类 这是它的一部分示例 class db private host private username private password private con private pdo public functi
  • Jquery 选择器:如何:更改链接悬停时图像标记的 src 属性

    当链接悬停时 我需要更改图像的 src 属性 div class clear span 33 last div class hicon span 1 a href title Homepage img src Assets images h
  • 为什么受保护的继承会导致dynamic_cast失败?

    我将 C 基类更改为protected继承和我的dynamic cast s 停止工作 为什么要改变继承protected改变的行为dynamic cast struct Base static Base lookupDerived Act
  • 需要用Java编写一个RESTful JSON服务

    这是我的要求 我在 mysql 中有一个简单的表 考虑任何带有几个字段的表 我需要用 Java 编写一个简单的 RESTFUL JSON Web 服务 用于对此表执行 CRUD 操作 我尝试在网上搜索一些全面的示例 但找不到任何示例 有人可
  • 如何测试SSIS包?

    如何测试SSIS包 测试时应注意哪些事项 ssis 包 测试时应该编写哪些测试用例步骤 ssisUnit是一个用于对 SSIS 包进行单元测试的出色工具 我遇到的唯一警告是您需要在安装了 SSIS 服务器组件的计算机上运行单元测试 我在一家
  • 如何在 PHP 中删除十进制数的最后一位数字

    我想在 PHP 中删除十进制数的最后一位数字 假设我有 14 153 我希望它是 14 15 我将执行此步骤 直到我的数字不再是小数 我认为这应该有效
  • 如何对 QPlainTextEdit 进行分页?

    我一直在使用 QPlainTextEdit 在我们的应用程序中编辑文本 最近我们决定需要以分页格式显示文本 而不是一致的文本块 经过大量研究 我意识到虽然 QPlainTextEdit 没有任何页面或分页知识 但 QPlainTextDoc
  • 使用服务帐户的 YouTube 报告 API

    按照 Google 的文档 您应该能够使用 YouTube Reporting API 而无需使用服务帐户进行用户身份验证 目前我有一个非常简单的示例 它应该为我提供可用工作的列表 但也可能为空 但我的 403 权限被拒绝 Request
  • 如何以编程方式添加 UINavigationBar 及其上的后退按钮

    我是新手 尝试制作一个类似于 iPhone 的 Notes 应用程序UITextView 我正在得到textView和线路并且工作正常 我的问题是我想添加一个UINavigationBar和其上的后退按钮 我想添加一个UIToolBar底部
  • 如何比较 php/mysql 中的日期和时间

    我需要比较 php mysql 中的日期和时间基本上我有一个应用程序和一个服务器应用程序需要连接到服务器以检查数据库中的新条目 服务器从应用程序接收日期时间作为字符串 这是在此处完成的 SimpleDateFormat dateformat
  • C99 可变长度数组最大大小和 sizeof 函数

    我正在尝试在我的 C 代码中使用可变长度数组 VLA 并试图加深对它们应该做什么和不应该做什么的理解 我的函数中有以下片段 void get pdw frame usb pdws t pdw frame pdw io t pdw io un
  • powershell get-childitem 到 csv 并包含详细信息

    我正在尝试为具有深层文件夹结构的文件共享创建 CSV 文件 我希望 CSV 看起来像 filename filepath file type folderStructure 到目前为止我有以下内容 Get ChildItem Path D
  • 具有多重继承的消息映射 MFC:如何避免警告 C4407 和运行时崩溃

    我最近将一个项目从 VS2008 移植到 VS2013 并遇到了一些堆栈损坏问题 经过一番研究 我可以通过以下代码查明原因 class CInternalInterface afx msg void OnMouseMove UINT CPo
  • copy_from_user() 的任何示例吗?内核和用户空间

    我正在寻找将 PID 值从用户空间复制到内核空间 这是我的代码快照 内核模块 include