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

C 如何在内核编程中执行shell命令?,c,ubuntu,linux-kernel,kernel-module,C,Ubuntu,Linux Kernel,Kernel Module,我想在我的c代码中使用stdlib.h的system()函数。我实际上在做内核编程 每当我想在其中使用system()时,它就会给stdlib.h错误,说找不到这样的文件。您不能从内核使用system()。故事结束了。没有可从内核空间执行的应用程序级代码 这不是一个简单的方法,因为system()是一个用户级C库函数,它涉及许多系统调用,包括: sys_fork() sys_execve() 您可以使用以下方法(我猜)获得系统()效果: 不确定这是否可行,但您可以尝试。您可能想要的是。该S

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


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

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

这不是一个简单的方法,因为system()是一个用户级C库函数,它涉及许多系统调用,包括:

 sys_fork()
 sys_execve()
您可以使用以下方法(我猜)获得系统()效果:

不确定这是否可行,但您可以尝试。

您可能想要的是。该SE答案包含一个指向IBM文章的链接,其中包含一个从内核调用的示例用户空间进程。您应该使用的搜索词是“usermodehelper”和“usermodehelper”

在内核中,请参阅:

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.
很简单

#include <linux/kmod.h>

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

call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC);
#包括
char*envp[]={“HOME=/”,NULL};
char*argv[]={/bin/ls”,NULL};
调用usermodehelper(argv[0],argv,envp,UMH\u WAIT\u EXEC);

在内核中使用
system()
从内核()调用用户空间命令通常是个坏主意。但这不是否决这个问题的好理由。你可以解释为什么他应该避免这样做,还有其他的选择。这只是我的意见
我想在我的c代码中使用stdlib.h的system()函数。我实际上在做内核编程。
,这是一个非常糟糕的主意,即使您意外地让它工作,但您的系统仍然没有崩溃。您是否尝试回显任何调试消息??如果是这种情况,请使用dmesg!!一般来说,把某件事描述为不好,但不解释原因是没有太大帮助的。内核向用户空间发送事件要灵活得多。例如,可用于向用户空间任务发送消息,从而启动所需的用户空间任务。这在如何处理事件等方面提供了更大的灵活性,因为它将有关事件发生情况的策略从内核移动到了用户空间。然后管理员可以决定做什么。这在嵌入式环境中并不重要,但仍应予以考虑。较新的内核在sysfs和/或procfs条目上提供。这也可以用作用户空间通知机制。然后,您的用户空间任务可以运行您熟悉的
系统()!我已经找了一段时间了!是否有可能获得以这种方式调用的命令的输出?
#include <linux/kmod.h>

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

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