17

Cコードでsystem()関数を使用したい。stdlib.h私は実際にカーネルプログラミングに取り組んでいます。

その中で使用したいときはいつでも、そのようなファイルが見つからないというsystem()エラーが発生します。stdlib.h

4

4 に答える 4

20

それは簡単です!

#include <linux/kmod.h>

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

call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC);
于 2013-03-28T15:06:50.677 に答える
6

おそらく必要なのは、ユーザー空間関数を実行することです。その 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.
于 2013-03-28T08:38:18.053 に答える
0

system() はユーザーレベルの C ライブラリ関数であり、次のような多くのシステム コールが含まれるため、簡単な方法ではありません。

 sys_fork()
 sys_execve()

次の方法を使用して system() 効果を得ることができます (私は推測します):

 create a kernel thread.

 let the kernel thread execute sys_execve( your command name)

これが機能するかどうかはわかりませんが、試すことができます。

于 2013-03-28T08:20:25.657 に答える
-5

カーネルから system() を使用することはできません。話の終わり。カーネル空間から実行するアプリケーション レベルのコードはありません。

于 2013-03-28T08:14:46.853 に答える