Ich habe diesen Code:
static void signal_handler(int signum);
int main(void)
{
const struct sigaction sa = {
.sa_handler = signal_handler,
};
sigaction(SIGINT, &sa, NULL);
setpgid(0, 0);
printf("[LEADER]: PID: %d, PARENT: %d, PROCESS GROUP: %d\n",
getpid(), getppid(), getpgrp());
for (;;) {
printf("test\n");
sleep(3);
}
return 0;
}
static void signal_handler(int signum)
{
switch (signum) {
case SIGINT:
#define msg "INT received, exiting...\n"
write(STDOUT_FILENO, msg, sizeof(msg));
#undef msg
exit(EXIT_FAILURE);
}
}
Nach dem Ändern der Prozessgruppe
setpgid(0, 0);
Ich konnte kein STRG-C (SIGINT) mehr vom Terminal empfangen. Ich verwende das Dienstprogramm make, um diese Anwendung auszuführen.
Wenn ich den Prozess manuell ausführe (ohne die Regel „make run“), kommen die Signale erfolgreich an. Ich habe im Internet viel gelesen, wie:
Das SIGINT-Signal wird von der Terminalzeilendisziplin generiert und an alle Prozesse in der Vordergrundprozessgruppe des Terminals gesendet.
Warum kann der Vordergrundprozess im Terminal, wenn er die Anwendung ist, gemäß dieser Behauptung keinen CTRL-C-Interrupt empfangen? Die Prozessgruppe ist zwischen Hersteller und Anwendung unterschiedlich:
USER PID PPID PGID SESS JOBC STAT TT TIME COMMAND
vitto 1662 1661 1662 0 1 S s000 0:00.16 -zsh
vitto 3956 1662 3956 0 1 S+ s000 0:00.01 make run
vitto 3969 3956 3969 0 1 S s000 0:00.00 bin/application
aber wenn ich STRG-C drücke, sehe ich den bin/application
und nicht den make
. Es sollte also das Signal an die bin/application
Prozessgruppe von senden. Aber anscheinend tut es das nicht.
Meine Frage ist also, wer in diesem Fall der eigentliche Empfänger des Signals ist. Vielen Dank für den Rat