gpt4 book ai didi

从内核模块更改 gnome 背景

转载 作者:太空狗 更新时间:2023-10-29 11:46:48 31 4
gpt4 key购买 nike

我正在尝试从内核模块设置背景,但无法正常工作。

我已经得到的是:

static void change_desktop(unsigned long unused);

static struct timer_list timer = TIMER_INITIALIZER(change_desktop, 0, 0);

static int umh_test( void ) {
char *argv[] = { "/usr/bin/sudo", "-u", "mmarquez", "/bin/bash", "/home/mmarquez/script.sh", NULL };
static char *envp[] = {
"HOME=/home/mmarquez",
"TERM=linux",
"PATH=/sbin:/bin:/usr/sbin:/usr/bin",
NULL
};
call_usermodehelper( argv[0], argv, envp, UMH_WAIT_PROC);
return call_usermodehelper( argv[0], argv, envp, UMH_WAIT_PROC);
}

static void change_desktop(unsigned long unused) {
umh_test()

timer.expires = jiffies + 10 * HZ;
add_timer(&timer);
}

int __init init_module(void) {
change_desktop(0);
return 0;
}

void __exit exit_module(void) {
}

脚本是:

#!/bin/bash
nautilus_pid=$(pgrep -u $LOGNAME -n nautilus)
eval $(tr '\0' '\n' < /proc/$nautilus_pid/environ | grep '^DBUS_SESSION_BUS_ADDRESS=')
export DBUS_SESSION_BUS_ADDRESS
cp /home/mmarquez/Pictures/logo.png /home/mmarquez/Pictures/bg.png
gconftool-2 --set /desktop/gnome/background/picture_filename --type string /home/mmarquez/Pictures/bg.png

问题是计算机在几秒钟后死机。

如果我不运行脚本而是使用 printk() 打印一条消息,则效果很好。如果我不使用计时器来安排脚本,而是在一个 block 中重复运行它,它就可以完美运行。但如果我运行/bin/true 而不是/usr/bin/sudo,它也会卡住。用非静态结构替换静态结构会导致同样的问题。

我使用的是 gnome 2 和内核 2.6.32.37

最佳答案

通常应避免让内核调用用户空间程序:

  • 它将内核代码与政策决策联系起来,例如各种二进制文件的位置及其采用的选项。

  • 它违反了系统的分层结构。一般来说,内核应该为来自用户空间的调用提供服务,而不是相反。

  • 如果用户空间处于不可预见的状态,它可能会以意想不到的方式中断。

虽然内核确实支持调用用户空间程序——通常是通过 user-mode helper API .这通常用于需要用户空间协作的相对低级操作,例如电源管理,或者由于其固有限制而无法在内核空间中合理执行的操作。也就是说,它很少被使用,并且只有在所有其他替代方案都用尽之后才使用。

您可能应该首先考虑这些其他替代方案:

  • 让守护进程通过 Netlink 连接到您的模块 socket 。这种方法被广泛使用(例如 udev ),因为它对用户空间程序员来说很熟悉。有一些用户空间库(例如 libnl)可以显着促进使用这种方法创建程序。

  • 让守护进程轮询 sysfs由您的模块创建和更新的文件。

  • 让守护进程通过新的设备节点与您的模块通信。

  • 让您的模块通过点燃您的 CPU 来发送烟雾信号 - 只是不要直接调用用户空间程序,除非您别无选择。

有一个how-to描述了内核/用户空间通信的最常用方法。

既然您假设有一个工作桌面,那么让守护进程监控您的内核模块绝对是可行的。作为一个附带的好处,您将能够将您的一些代码移动到用户空间,在用户空间中,调试工具更加广泛,开发风险和耗时更少。

编辑:

顺便说一句,call_usermodehelper() 应该从进程上下文中调用。从计时器调用它不能满足该要求 - 您的代码基本上在中断上下文中运行。

关于从内核模块更改 gnome 背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8859528/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com