Linuxカーネルモジュールでのプロセス実行の問題

Linuxカーネルモジュールでのプロセス実行の問題

カーネルモジュール内のプロセスを実行しようとしていますが、私のモジュールには/usr/bin次のものcall_usermodehelper()があります。

int rc;

char *argv[] = {"/usr/bin/myProgram", NULL};
char *envp[] = {"HOME=/", NULL};

rc = call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC);

printk("RC is: %i \n", rc);

私のサンプルプログラム/usr/bin

#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main(){

    char *arg[] = {"firefox", "sample.html", NULL};
    execvp(arg[0], arg);
    return 0;
}

syslogを見た後、RCが0(call_usermodehelper成功を示す)であることがわかりますが、プログラムは実際には実行されません(Firefoxブラウザを開く必要があります)。プロセスを手動で繰り返し/usr/bin実行すると、正常に動作し、予想される動作が実行されます。なぜこれが起こるのかわからず、オンラインで多くの情報が見つかりません。どんなアイデアがありますか?

この古い投稿を見つけました。http://www.linuxquestions.org/questions/programming-9/call_usermodehelper-problem-849860/あるユーザーが同様の問題を経験し、呼び出しが機能しないと主張しました。彼は私が元々していた問題を次のように解決しprintf()ました。system()exec()

int rc;

char *argv[] = {"/usr/bin/myProgram.o", NULL};
char *envp[] = {"HOME=/", NULL};

rc = call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC);

printk("RC is: %i \n", rc);

解決策

もっと遊んでカーネルにあるので、環境変数を明示的に宣言する必要があるという意見を見た後、カーネルモジュールを次のように変更し、ブラウザが開きます。call_usermodehelper()

int rc;

static char *envp[] = {
    "SHELL=/bin/bash",
    "HOME=/home/admin",
    "USER=admin",
    "PATH=/home/admin/bin:/home/admin/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/admin",
    "DISPLAY=:0",
    "PWD=/home/admin", 
    NULL};

char *argv[] = {"/home/admin/mySample", NULL};

rc = call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC);
printk("RC is: %i \n", rc);

これで、サンプルプログラムは次のようになります。

#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main()
{
    char *arg[] = {"firefox", "/home/admin/sample.html", NULL};
    execvp(arg[0], arg);
    return 0;
}

答え1

もっと遊んでカーネルにあるので、環境変数を明示的に宣言する必要があるという意見を見た後、カーネルモジュールを次のように変更し、ブラウザが開きます。call_usermodehelper()

int rc;

static char *envp[] = {
    "SHELL=/bin/bash",
    "HOME=/home/admin",
    "USER=admin",
    "PATH=/home/admin/bin:/home/admin/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/admin",
    "DISPLAY=:0",
    "PWD=/home/admin", 
    NULL};

char *argv[] = {"/home/admin/mySample", NULL};

rc = call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC);
printk("RC is: %i \n", rc);

これで、サンプルプログラムは次のようになります。

#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main()
{
    char *arg[] = {"firefox", "/home/admin/sample.html", NULL};
    execvp(arg[0], arg);
    return 0;
}

関連情報