Wie laichen ich einen Dämon in uClinux mit vfork?
Frage
Dies wäre einfach, mit fork (), aber ich habe keine MMU bekommt. Ich habe das vfork gehört () blockiert den Elternprozess, bis das Kind verlässt oder ausführt exec (). Wie würde ich erreichen so etwas wie dies:
pid_t pid = vfork();
if (pid == -1) {
// fail
exit(-1);
}
if (pid == 0) {
// child
while(1) {
// Do my daemon stuff
}
// Let's pretend it exits sometime
exit();
}
// Continue execution in parent without blocking.....
Lösung
Es scheint, dass es keine Möglichkeit gibt, diese genau zu tun, wie Sie es hier haben. exec
oder _exit
haben für die Eltern genannt bekommen die Ausführung fortzusetzen. Entweder setzen Sie den Dämon-Code in einer anderen ausführbaren Datei und exec
es, oder das Kind verwenden, um die ursprüngliche Aufgabe zu laichen. Der zweite Ansatz ist die hinterhältige Art und Weise, und wird hier beschrieben.
Andere Tipps
Daemon () Funktion für uClinux Systeme ohne MMU und Gabel ( ), von Jamie Lokier, in Patch-Format
Sie können nicht tun Daemon () mit vfork (). Um etwas ähnlich wie ein Dämon auf! MMU mit vfork () zu erstellen, der übergeordnete Prozess nicht stirbt (so gibt es zusätzliche Prozesse), und Sie sollten Ihren Daemon auf dem Hintergrund (dh durch Anhängen & an die Befehlszeile auf den Anruf Shell).
Auf der anderen Seite, Linux bietet Klon (). Ausgerüstet mit diesem Wissen und Pflege ist es möglich, Daemon () für! MMU zu implementieren. Jamie Lokier hat eine Funktion zu tun, nur dass auf ARM und i386, erhalten sie von
Ich hätte gedacht, dass dies die Art von Problem wäre, dass viele andere, die vor gelaufen waren, aber ich habe eine harte Zeit die Suche nach jemandem habe reden über die „kill the parent“ Probleme. Ich dachte zunächst, dass Sie in der Lage sein sollte, das mit einem (nicht ganz so, aber irgendwie) zu tun einfachen Aufruf zu Abgesehen davon, dass die child_stack Bestimmung und die child_func die Art und Weise zu arbeiten, dass es mit vfork tut, ist ziemlich schwierig, da child_func brauchen würde die Absenderadresse aus dem Klon Aufruf zu sein und die child_stack würde die Spitze des Stapels an der sein muß Punkt, dass der tatsächliche Systemaufruf (sys_clone) hergestellt wird. Sie könnten wahrscheinlich versuchen Was ich vielleicht denken, was Sie wollen. NULL als zweites Argument übergeben, die die child_stack Zeiger sind, bewirkt, dass der Kernel die gleiche Sache zu tun, wie es funktioniert in vfork und Gabel, das den gleichen Stapel als Mutter zu verwenden ist. Ich habe noch nie entspricht Wenn dies nicht funktioniert (und Sie können nicht herausfinden, wie ähnlich, etwas zu tun), dann können Sie in der Lage sein, den regulären Klon Aufruf zu verwenden, zusammen mit clone
, wie folgt aus: pid_t new_vfork(void) {
return clone(child_func, /* child function */
child_stack, /* child stack */
SIGCHLD | CLONE_VM, /* flags */
NULL, /* argument to child */
NULL, /* pid of the child */
NULL, /* thread local storage for child */
NULL); /* thread id of child in child's mem */
}
sys_clone
rufen direkt mit pid_t new_vfork(void) {
return sys_clone( SIGCHLD | CLONE_VM, NULL);
}
sys_clone
direkt verwendet und habe nicht getestet, aber ich denke, es sollte funktionieren. Ich glaube, dass: sys_clone( SIGCHLD | CLONE_VM | CLONE_VFORK, NULL);
vfork
. setjump
und longjmp
Anrufen es zu emulieren, oder Sie können möglicherweise erhalten um die Notwendigkeit für die „Rückkehr zweimal“ Semantik von fork
und vfork
.