CTR-C kann nach dem Ändern der Prozessgruppe nicht empfangen werden

CTR-C kann nach dem Ändern der Prozessgruppe nicht empfangen werden

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/applicationund nicht den make. Es sollte also das Signal an die bin/applicationProzessgruppe 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

verwandte Informationen