カーネルモジュールからバックグラウンドを設定しようとしていますが、動かすことができません。カーネルモジュールからGNOMEバックグラウンドを変更する
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()を使用してメッセージを出力すると、正常に動作します。タイマーでスクリプトをスケジュールするのではなく、ブロックで繰り返し実行すると、完全に機能します。しかし、/ usr/bin/sudoではなく/ bin/trueを実行するとフリーズします。静的構造体を静的でないものに置き換えると、同じ問題が発生します。
私はカーネル呼び出しユーザ空間プログラムは、一般的に避けるべき持つGNOME 2とカーネル2.6.32.37
なぜこれを行うにはカーネルモジュールを使用していますか? – Dave
このようにしないでください。なぜなら、カーネルはデスクトップを実行しなくても実行できるからです。絶対に必要な場合は、デスクトップ起動スクリプトを変更してカーネルにモジュールについて問い合わせを行い、バックグラウンドを変更してください。 –
@同僚のいたずらです。それが手の込んだものだとしましょう。 – Juan