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.....
War es hilfreich?

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 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 */
}

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 sys_clone rufen direkt mit

pid_t new_vfork(void) {
    return sys_clone( SIGCHLD | CLONE_VM, NULL);
}

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 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);

entspricht vfork.

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

scroll top