Ответ 1
Это просто!
#include <linux/kmod.h>
char * envp[] = { "HOME=/", NULL };
char * argv[] = { "/bin/ls", NULL };
call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC);
Я хочу использовать system()
функцию stdlib.h
в моем c-коде. Я фактически работаю над программированием ядра.
Всякий раз, когда я хочу использовать 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);
То, что вы, вероятно, хотите, - выполнение функции пользовательского пространства. Этот ответ 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.
Нет простого способа, потому что system() - это функция библиотеки C на уровне пользователя, которая включает в себя множество системных вызовов, включая:
sys_fork()
sys_execve()
Вы можете воспользоваться эффектом system(), используя следующие способы (я думаю):
create a kernel thread.
let the kernel thread execute sys_execve( your command name)
Не уверен, что это может сработать, но вы можете попробовать.
Вы не можете использовать system() из ядра. Конец истории. Для выполнения из пространства ядра не существует кода уровня приложения.