2013-03-28 2 views
13

내 코드에서 stdlib.hsystem() 기능을 사용하고 싶습니다. 커널 프로그래밍을 실제로하고 있습니다.커널 프로그래밍에서 쉘 명령을 실행하는 방법은 무엇입니까?

system()을 사용하고 싶을 때마다 stdlib.h에 해당 파일이 없다는 오류가 표시됩니다.

+6

커널에서 사용자 공간 명령을 호출하는 것은 좋지 않은 나쁜 생각입니다. – favoretti

+3

커널에서'system()'을 사용하는 것은 좋지 않습니다. 그러나 질문에 찬성표를 던지는 것이 그만한 이유는 아닙니다. 왜 그가 이것을 피해야하는지, 대안은 무엇인지 설명 할 수 있습니다. _ 내 의견이다. – deepmax

+0

'내 C 코드에서 stdlib.h의 system() 함수를 사용하고 싶다. 실제로 커널 프로그래밍 작업을하고 있습니다. ', 정말 정말 나쁜 생각입니다 !! , 놀랍게도 작동하도록 만들었지 만 여전히 시스템이 다운되지는 않았습니다. 디버깅 메시지를 에코하려고합니까? 그렇다면 [printk()] (http://www.makelinux.net/books/lkd2/ch18lev1sec3) 및 dmesg !! –

답변

-4

커널에서 system()을 사용할 수 없습니다. 이야기의 끝. 커널 공간에서 실행할 응용 프로그램 레벨 코드는 없습니다.

+0

전혀 도움이되지 않습니다. 그 이유를 설명하십시오. – AbiusX

0

쉬운 방법, 시스템() 등 많은 시스템 호출, 관련 사용자 레벨 C 라이브러리 함수이기 때문에 : 다음과 같은 방법을 사용하여

sys_fork() 
sys_execve() 

당신은 acchive 수있는 시스템() 효과 (I 추측) :

create a kernel thread. 

let the kernel thread execute sys_execve(your command name) 

잘 될지 모르지만 시도해 볼 수 있습니다.

5

아마도 원하는 것은 executing a userspace function입니다. 그 SE 응답에는 커널에서 호출 된 예제 사용자 공간 프로세스가있는 IBM 기사에 대한 링크가 포함됩니다. 사용해야하는 검색어는 "usermodehelper"및 "usermode helper"입니다. 커널에서

은 다음을 참조하십시오

[email protected]:~/linux-2.6/linux-2.6$ find . -type f | xargs grep "usermode.helper" 
./kernel/cgroup.c:  /* Drop the lock while we invoke the usermode helper, 
./kernel/kmod.c: /* CLONE_VFORK: wait until the usermode helper has execve'd 
./kernel/kmod.c: * call_usermodehelper_setup - prepare to call a usermode helper 
./drivers/block/drbd/drbd_int.h:extern char usermode_helper[]; 
./drivers/block/drbd/drbd_nl.c: char *argv[] = {usermode_helper, cmd, mb, NULL }; 
./drivers/block/drbd/drbd_nl.c: dev_info(DEV, "helper command: %s %s %s\n", usermode_helper, cmd, mb); 
./drivers/block/drbd/drbd_nl.c: ret = call_usermodehelper(usermode_helper, argv, envp, UMH_WAIT_PROC); 
./drivers/block/drbd/drbd_nl.c:    usermode_helper, cmd, mb, 
./drivers/block/drbd/drbd_nl.c:    usermode_helper, cmd, mb, 
./drivers/block/drbd/drbd_nl.c: char *argv[] = {usermode_helper, cmd, tconn->name, NULL }; 
./drivers/block/drbd/drbd_nl.c: conn_info(tconn, "helper command: %s %s %s\n", usermode_helper, cmd, tconn->name); 
./drivers/block/drbd/drbd_nl.c: ret = call_usermodehelper(usermode_helper, argv, envp, UMH_WAIT_PROC); 
./drivers/block/drbd/drbd_nl.c:   usermode_helper, cmd, tconn->name, 
./drivers/block/drbd/drbd_nl.c:   usermode_helper, cmd, tconn->name, 
./drivers/block/drbd/drbd_main.c:char usermode_helper[80] = "/sbin/drbdadm"; 
./drivers/block/drbd/drbd_main.c:module_param_string(usermode_helper, usermode_helper, sizeof(usermode_helper), 0644); 
./drivers/block/drbd/drbd_main.c:  * currently blocked waiting for that usermode helper to 
./security/keys/request_key.c: * Initialise a usermode helper that is going to have a specific session 
./security/keys/request_key.c: * Clean up a usermode helper with session keyring. 
./security/keys/request_key.c: * Call a usermode helper with a specific session keyring. 
14

그것은 간단합니다!

#include <linux/kmod.h> 

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

call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC); 
+0

굉장해! 나는 이것을 잠시 동안 찾고 있었다! – AbiusX

+3

이런 식으로 불리는 명령의 출력을 얻을 수 있습니까? – AlexSee

관련 문제