2013-03-28 5 views
13

Ich möchte system() Funktion von stdlib.h in meinem c-Code verwenden. Ich arbeite gerade an der Kernel-Programmierung.Wie Shell-Befehl in Kernel-Programmierung ausführen?

Immer wenn ich system() in es verwenden möchte, gibt es Fehler stdlib.h sagen keine solche Datei gefunden.

+6

Es ist im Allgemeinen eine schlechte schlechte schlechte Idee, Benutzerraumbefehle vom Kern zu benennen :) – favoretti

+3

'system()' im Kern zu verwenden ist eine schlechte Idee. Aber es ist kein guter Grund, die Frage abzustimmen. Sie können erklären, warum er das vermeiden sollte und welche Alternativen es gibt. _Es ist nur meine Meinung_ – deepmax

+0

'Ich möchte System() -Funktion von stdlib.h in meinem c-Code verwenden. Ich arbeite gerade an der Kernel-Programmierung. Es ist wirklich eine sehr schlechte Idee !! , auch wenn es überraschend funktioniert, und trotzdem ist Ihr System nicht abgestürzt. Versuchen Sie, irgendwelche Debugging-Meldungen zu wiederholen? Wenn das der Fall ist, benutze [printk()] (http://www.makelinux.net/books/lkd2/ch18lev1sec3) und dmesg !! –

Antwort

-4

Sie können system() nicht aus dem Kernel verwenden. Ende der Geschichte. Es gibt keinen Code auf Anwendungsebene, der vom Kernelbereich ausgeführt werden kann.

+0

nicht hilfreich. Beschreibe warum nicht. – AbiusX

0

Keine einfache Art und Weise, weil system() ist eine Funktion C-Bibliothek auf Benutzerebene, die viele Systemaufrufe beinhalten, einschließlich:

sys_fork() 
sys_execve() 

Sie könnten folgende Möglichkeiten acchive system() Effekt mit (ich schätze,):

create a kernel thread. 

let the kernel thread execute sys_execve(your command name) 

Nicht sicher, dass dies funktionieren könnte, aber Sie können es versuchen.

5

Was Sie wahrscheinlich wollen, ist executing a userspace function. Diese SE-Antwort enthält eine Verknüpfung zu einem IBM-Artikel mit einem Beispiel-Userspace-Prozess, der vom Kernel aufgerufen wird. Die Suchbegriffe, die Sie verwenden sollten, sind "usermodehelper" und "usermode helper".

Im Kern finden Sie unter:

[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. 
14

Es ist ganz einfach!

+0

genial! Ich habe das eine Weile gesucht! – AbiusX

+3

Ist es möglich, die Ausgabe eines auf diese Weise aufgerufenen Befehls zu erhalten? – AlexSee

Verwandte Themen