- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试从内核模块设置背景,但无法正常工作。
我已经得到的是:
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/
我有一个脚本,需要在用户通过 nx 客户端登录后启动。据我了解,Gnome 在用户登录后启动(如果我错了,请纠正我)。我应该把脚本放在哪里,以便它在用户登录后启动? 相关信息:我正在一台 redhat
我想通过我的 shell 扩展支持多个 GNOME 版本。如何检测它运行的 GNOME 版本并适本地分支代码? 最佳答案 const Config = imports.misc.config; if
我在 Gnome 中有一个窗口,我想删除其标题栏。这在 FVWM2 中很容易:我只是将窗口样式设置为包含 NoTitle .在 Gnome 中似乎没有类似的选项。 我最近学会了使用 wmctrl修改符
我如何开始为 GNOME 做贡献?我会用 C++ 和 Python 编程,但从未接触过 C。我什至不熟悉 GTK。 老实说,我不知道 GNOME 是如何工作的。我所拥有的只是以某种方式为它做出贡献的强
有没有办法禁用 Gnome 经典桌面热角(左上角)?我不小心激活它的频率比我故意激活的频率要高得多,这很烦人。我有一个 Fn+whatever 键可以做同样的事情,所以我真的不需要热角。 最佳答案 您
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 10年前关闭。 Improve this qu
我想编写一个扩展,其功能与GNOME Shell中"focus-follows mouse"设置相反:我想使指针移动到当前聚焦窗口的中心。 可以在GNOME Shell扩展中完成吗?我看到了一些包装x
如何添加事件或其他方法来监听 gnome shell 扩展上的按键?例如每次按键都显示一个对话框,显示按下的键? 我找不到任何例子。 documentation提到了 keyboard模块,但是使用该
我尝试过: gsettings set org.gnome.desktop.background primary-color '#000000' gsettings set org.gnome.des
我已经使用 gedit 作为编程文本编辑器有一段时间了... 我想将最近打开的文件数量从 5 个增加到 10 个... 我检查了 gedit 首选项和 gconf-editor gedit 选项,但没
我试图让 guile-gnome 与安装在我机器上的 Guile 一起工作。我已经根据 the instructions here 下载并构建了 guile-gnome ,但无论我给它什么前缀,我似乎
我电脑的面板分辨率为 3840 x 2160 像素。如果我打开一个 gnome-boxes session ,虚拟机代码占用的空间比邮票大一点。 GNOME-Boxes 报告我看到了 1920 x 1
我曾经用 No Topleft Hot Corner 禁用 gnome-shell 的热角功能。扩大。升级到 gnome-shell 40 已弃用。 Gnome-tweaks声称它也可以禁用它,但是激
有没有办法从命令行启动 gnome-terminal(即,使用/usr/bin/gnome-terminal 命令)并让新终端继承运行命令的终端的环境变量和其他设置变量?场景是这样的: 打开终端 设置
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 8年前关闭。 Improve thi
我正在尝试编写我的第一个 Shell 扩展,并且 - 正如那里的每篇博客文章一样 - 我因缺乏最新文档而苦苦挣扎...... 也就是说,我正在尝试从键盘上获取所有击键,并且 - 查看在线代码和旧邮件列
如何更改背景颜色?我选择了 Profile > Background > solid color ,但我在哪里可以选择颜色? 最佳答案 有两种受支持的方法可以更改 xterm 的背景颜色(请记住 xt
我写了一个小的 GNOME Shell 扩展,我想分发给一些同事。 为此,我创建了一个 RPM。安装后需要重新启动 GNOME-Shell 才能使扩展可见,因此可以启用它。通过使用 其次是 r使用 X
我目前正在尝试重构现有的 gnome-shell 扩展的代码库。部分原因是引入单元测试,因为在 2016 年不使用测试似乎相当疏忽。 经过一番修补后,我设法设置了一个有效的 node-phantomj
Gnome Shell 有很好的快捷方式,但是,我找不到以编程方式调用它们的方法 假设我想使用 GJS 脚本启动 Google Chrome,将其移动到工作区 1,并将其最大化,然后启动 Emacs,
我是一名优秀的程序员,十分优秀!