Frage

In meinem Programm habe ich die Gabel () mehrmals je nach Benutzereingabe.

In bestimmten Fällen möchte ich SIGCHLD zu handhaben und etwas zu sagen wie „Process # Finished“. obwohl in anderen Fällen, ich möchte dieses Signal ignorieren.

Wie kann ich das tun?

War es hilfreich?

Lösung

Signalverarbeitung wird global für den Prozess eingerichtet. Wenn Sie ein asynchrones Signal wie SIGCHLD fangen wollen, wenn einige Kinder beenden, andere aber nicht, kann man nicht entscheiden, es im Voraus für einige zu ignorieren.

Sie müssen das Signal jedes Mal in der Mutter zu handhaben, dann entscheiden, ob Sie es in Ihrem Handler ignoriert werden sollen.

sollten mindestens bei den Handler tun, um eine wait () auf dem Kind (si_pid in der siginfo_t Struktur) seinen Rückkehrcode zu ernten. An diesem Punkt können Sie die Prozess-ID überprüfen und entscheiden, was anderes zu tun. Sie müssen nicht alles drucken, wenn Sie wollen nicht.

Andere Tipps

Sie möchten das Signal SIGCHLD fangen und dann eine Funktion aufrufen. Sie wollen signal() verwenden, um diese (man signal) zu tun. Im folgende Beispiel wird child_died() aufgerufen, nachdem das Signal SIGCHLD gefangen wird (Child-Prozess ist an dieser Stelle tot). Wenn es Informationen, die Sie brauchen, um die Eltern von dem Kind zu übergeben, die Bedürfnisse für eine bedingte child_died(), benötigen Sie ein Rohr (man pipe) zu verwenden. Hier ist ein Beispiel von Signal- und Rohr:

#include <signal.h>
#include <strings.h>
#include <stdio.h>

#define MAX_SIZE 256

void child_died(int);

int fd[2];

int main()
{
    int pid;
    extern int fd[];
    char *str;

    pipe(fd);
    signal(SIGCHLD, child_died);

    if ((pid = fork()) < 0) {
        // error
        printf("Error\n");
    } else if (pid == 0) {
        // child
        printf("In child process\n");
        close(fd[0]);
        str = strdup("Message from child process.\n");
        write(fd[1], str, strlen(str) + 1);
    } else {
        // parent
        wait();
        printf("Now in parent\n");
    }

    return 0;
}

void child_died(int s)
{
    char *str;
    close(fd[1]);
    read(fd[0], str, MAX_SIZE);
    printf("%s", str);
}

Gespeichert als sigchld.c und kompiliert mit: gcc -Wall sigchld.c -o sigchld

Wenn Sie einen int übergeben wollen (wie das Kind pid) oder einen anderen Datentyp aus dem untergeordneten Prozess zu dem übergeordneten Prozess werden Sie entweder müssen sie in eine Zeichenfolge konvertieren und wieder zurück oder eine anderen Weg finden zu tun es.

Wenn Sie SIGCHLD dann in meinem Beispiel ignorieren wollen würden Sie diese Logik in child_died() setzen. Verwenden Sie einfach ein einfaches if. Ich weiß nicht, wie Sie, wenn sich entscheiden, um das Signal zu ignorieren und wann zu drucken, was Sie wollen, das ist, warum ich das Rohr Sachen in meinem obigen Code enthalten. Ich dachte, Sie ein paar Informationen von dem untergeordneten Prozess verwenden würden und da child_died() auf dem übergeordneten Prozess aufgerufen wird, werden Sie brauchen eine Möglichkeit, um Daten von dem Kind zu Eltern-Prozess zu übertragen.

Ich hoffe, das hilft. Es kann besser oder einfacher sein, Wege, dies zu erreichen, die ich weiß nicht, von. Wenn es dann bitte kommentieren ist.

Sie können waitpid Funktion in entweder blockieren oder nicht-blockierenden Modus zu warten, bis das Signal von einem bestimmten Kind verwenden und dann einige Verarbeitung zu tun. In der Tat, Sie Haben wait irgendeine Art zu verwenden, wie es in Grahams Antwort angegeben wird ...

Wenn Sie SIGCHLD dann die Prozesstabelle ignorieren mit Zombies füllen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top