커널 모듈에 있는 프로세스를 실행하려고 하는데 내 모듈에는 /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;
}