내 코드에서 stdlib.h
의 system()
기능을 사용하고 싶습니다. 커널 프로그래밍을 실제로하고 있습니다.커널 프로그래밍에서 쉘 명령을 실행하는 방법은 무엇입니까?
system()
을 사용하고 싶을 때마다 stdlib.h
에 해당 파일이 없다는 오류가 표시됩니다.
내 코드에서 stdlib.h
의 system()
기능을 사용하고 싶습니다. 커널 프로그래밍을 실제로하고 있습니다.커널 프로그래밍에서 쉘 명령을 실행하는 방법은 무엇입니까?
system()
을 사용하고 싶을 때마다 stdlib.h
에 해당 파일이 없다는 오류가 표시됩니다.
커널에서 system()을 사용할 수 없습니다. 이야기의 끝. 커널 공간에서 실행할 응용 프로그램 레벨 코드는 없습니다.
전혀 도움이되지 않습니다. 그 이유를 설명하십시오. – AbiusX
쉬운 방법, 시스템() 등 많은 시스템 호출, 관련 사용자 레벨 C 라이브러리 함수이기 때문에 : 다음과 같은 방법을 사용하여
sys_fork()
sys_execve()
당신은 acchive 수있는 시스템() 효과 (I 추측) :
create a kernel thread.
let the kernel thread execute sys_execve(your command name)
잘 될지 모르지만 시도해 볼 수 있습니다.
아마도 원하는 것은 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.
커널에서 사용자 공간 명령을 호출하는 것은 좋지 않은 나쁜 생각입니다. – favoretti
커널에서'system()'을 사용하는 것은 좋지 않습니다. 그러나 질문에 찬성표를 던지는 것이 그만한 이유는 아닙니다. 왜 그가 이것을 피해야하는지, 대안은 무엇인지 설명 할 수 있습니다. _ 내 의견이다. – deepmax
'내 C 코드에서 stdlib.h의 system() 함수를 사용하고 싶다. 실제로 커널 프로그래밍 작업을하고 있습니다. ', 정말 정말 나쁜 생각입니다 !! , 놀랍게도 작동하도록 만들었지 만 여전히 시스템이 다운되지는 않았습니다. 디버깅 메시지를 에코하려고합니까? 그렇다면 [printk()] (http://www.makelinux.net/books/lkd2/ch18lev1sec3) 및 dmesg !! –