我想在我的C代码中使用stdlib.h
库的system()
函数。实际上,我正在进行内核编程。
每当我想要在其中使用system()
时,它会提示stdlib.h
文件不存在的错误。
我想在我的C代码中使用stdlib.h
库的system()
函数。实际上,我正在进行内核编程。
每当我想要在其中使用system()
时,它会提示stdlib.h
文件不存在的错误。
很简单!
#include <linux/kmod.h>
char * envp[] = { "HOME=/", NULL };
char * argv[] = { "/bin/ls", NULL };
call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC);
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.
没有简单的方法,因为system()是一个用户级C库函数,涉及许多系统调用,包括:
sys_fork()
sys_execve()
您可以使用以下方式来实现system()效果(我猜测):
create a kernel thread.
let the kernel thread execute sys_execve( your command name)
不确定这是否可行,但你可以尝试一下。
在内核中不能使用system()。就这样。在内核空间没有应用级别的代码可以执行。
system()
是一个不好的主意。但这并不是打负评的好理由。你可以解释为什么要避免使用它,以及有哪些替代方案。这只是我的观点。 - masoudinotify
。这也可以用作用户空间通知机制。您的用户空间任务可以运行您熟悉的system()
。 - artless noise