Ich programmiere, dass ich in C fork () 's aus einem Child-Prozess geschrieben habe. Keiner der Prozesse wird beendet. Wenn ich das Programm von der Kommandozeile aus starte und Control-C drücke, welche Prozesse erhalten das Interrupt-Signal?
Ich programmiere, dass ich in C fork () 's aus einem Child-Prozess geschrieben habe. Keiner der Prozesse wird beendet. Wenn ich das Programm von der Kommandozeile aus starte und Control-C drücke, welche Prozesse erhalten das Interrupt-Signal?
Antworten:
Warum probieren wir es nicht aus und sehen? Hier ist ein einfaches Programm mitsignal(3)
, um SIGINT
sowohl den übergeordneten als auch den untergeordneten Prozess abzufangen und eine Nachricht auszudrucken, die den Prozess identifiziert, wenn er eintrifft.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
void parent_trap(int sig) {fprintf(stderr, "They got back together!\n");}
void child_trap(int sig) {fprintf(stderr, "Caught signal in CHILD.\n");}
int main(int argc, char **argv) {
if (!fork()) {
signal(SIGINT, &child_trap);
sleep(1000);
exit(0);
}
signal(SIGINT, &parent_trap);
sleep(1000);
return 0;
}
Nennen wir das test.c
. Jetzt können wir es ausführen:
$ gcc test.c
$ ./a.out
^CCaught signal in CHILD.
They got back together!
Im Terminal erzeugte Interrupt-Signale werden an die aktive Prozessgruppe weitergeleitet, die hier sowohl übergeordnet als auch untergeordnet ist . Sie können das beide child_trap
und sehenparent_trap
ausgeführt wurden , als ich gedrückt Ctrl- C.
Es gibt eine lange Diskussion über Wechselwirkungen zwischenfork
und Signalen in POSIX . Das Wesentlichste dabei ist:
Ein Signal, das an die Prozessgruppe nach dem fork () gesendet wird, sollte sowohl an das übergeordnete als auch an das untergeordnete Element gesendet werden.
Sie stellen außerdem fest, dass sich einige Systeme möglicherweise nicht genau richtig verhalten, insbesondere, wenn das Signal sehr nahe an der Uhrzeit des eintrifft fork()
. Um herauszufinden, ob Sie sich auf einem dieser Systeme befinden, müssen Sie wahrscheinlich den Code lesen oder viel Glück haben, da die Interaktionen bei jedem einzelnen Versuch unwahrscheinlich sind.
Andere nützliche Punkte sind:
kill
) gesendet wird, wird nur an diesen Prozess gesendet , unabhängig davon, ob es sich um den übergeordneten oder den untergeordneten Prozess handelt.SIGINT
Code beendet (Standardverhalten).