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

use*_*972 15 c ubuntu kernel-module linux-kernel

我想在我的c代码中使用system()函数stdlib.h.我实际上在研究内核编程.

每当我想在其中使用system()时,它stdlib.h说错误说没有找到这样的文件.

Ily*_*kov 17

这很简单!

#include <linux/kmod.h>

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

call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC);
Run Code Online (Sandbox Code Playgroud)

  • 是否有可能获得以这种方式调用的命令的输出? (4认同)

Jon*_*ham 5

你可能想要的是执行用户空间功能.该SE答案包含指向IBM文章的链接,其中包含从内核调用的示例用户空间进程.您应该使用的搜索词是"usermodehelper"和"usermode helper".

在内核中,请参阅:

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.
Run Code Online (Sandbox Code Playgroud)


Ran*_*ard -5

您不能从内核使用 system()。故事结局。没有可以从内核空间执行的应用程序级代码。