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;
}

관련 정보