简体   繁体   English

如何在内核编程中执行shell命令?

[英]How to execute shell command in kernel programming?

I want to use system() function of stdlib.h in my c code. 我想在我的c代码中使用stdlib.h system()函数。 I am actually working on kernel programming. 我实际上在研究内核编程。

Whenever i want to use system() in it, it gives error to stdlib.h saying no such file found. 每当我想在其中使用system()时,它就会给stdlib.h带来错误,说没有找到这样的文件。

It's simple! 这很简单!

#include <linux/kmod.h>

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

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

What you probably want is executing a userspace function . 你可能想要的是执行用户空间功能 That SE answer includes a link to an IBM article with an example userspace process invoked from the kernel. 该SE答案包含指向IBM文章的链接,其中包含从内核调用的示例用户空间进程。 The search terms you should use are "usermodehelper" and "usermode helper". 您应该使用的搜索词是“usermodehelper”和“usermode helper”。

In the kernel, see: 在内核中,请参阅:

yba@tavas:~/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.

No easy way, because system() is a user-level C library function, which involve many system calls, including: 没有简单的方法,因为system()是一个用户级C库函数,涉及许多系统调用,包括:

 sys_fork()
 sys_execve()

You could acchive system() effect using the following ways ( I guess): 您可以使用以下方式获取system()效果(我猜):

 create a kernel thread.

 let the kernel thread execute sys_execve( your command name)

Not sure this could work, but you can try. 不确定这可行,但你可以试试。

You can't use system() from the kernel. 你不能使用内核中的system()。 End of story. 故事结局。 There is no application level code to execute from the kernel space. 没有应用程序级代码可以从内核空间执行。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM