Warum bekomme ich inkonsistente Signale für eine verwaiste Prozessgruppe?Linux

Linux verstehen
Anonymous
 Warum bekomme ich inkonsistente Signale für eine verwaiste Prozessgruppe?

Post by Anonymous »

Ich arbeite ein Beispiel in der erweiterten Programmierung in der UNIX-Umgebung: < /p>

Code: Select all

#include 
#include 
#include 
#include 
#include 

static void
sig_hup(int signo)
{
printf("SIGHUP received, pid = %ld\n", (long)getpid());
}

static void
pr_ids(char *name)
{
printf("%s: pid = %ld, ppid = %ld, pgrp = %ld, tpgrp = %ld\n",
name, (long)getpid(), (long)getppid(), (long)getpgrp(),
(long)tcgetpgrp(STDIN_FILENO));
fflush(stdout);
}

int
main(void)
{
char    c;
pid_t   pid;

pr_ids("parent");
if ((pid = fork()) < 0) {
exit(1);
} else if (pid > 0) {   /* parent */
sleep(5);       /* sleep to let child stop itself */
} else {            /* child */
pr_ids("child");
signal(SIGHUP, sig_hup);    /* establish signal handler */
printf("test\n");
kill(getpid(), SIGTSTP);    /* stop ourself */
pr_ids("child");    /* prints only if we're continued */
if (read(STDIN_FILENO, &c, 1) != 1)
printf("read error %d on controlling TTY\n", errno);
}
exit(0);
}
< /code>
Die Idee ist, dass: < /p>

 Wir erstellen untergeordneten Prozess < /li>
 Es hat einen Handler für Seufzer < /li>
 Wir stoppen das Kind mit SIGTSTP < /li>
 tector. />PoSix.1 erfordert, dass die gestoppte verarbeitete Seufzer (die wir handhaben) gesendet werden sollten (die wir handhaben), gefolgt von Sigcont < /li>
 Dies sollte den Seufzhandler des Kindes ausführen und fortfahren. Process < /li>
< /ul>
Wenn Sie dieses Programm aus der Hülle ausführen.$ ./a.out
parent: pid = 6099, ppid = 2837, pgrp = 6099, tpgrp = 6099
child: pid = 6100, ppid = 6099, pgrp = 6099, tpgrp = 6099
$ SIGHUP received, pid = 6100
child: pid = 6100, ppid = 1, pgrp = 6099, tpgrp = 2837
read error 5 on controlling TTY
< /code>
Meine Ergebnisse sind jedoch: < /p>

 Entweder keine Nachricht, dass Seufzer empfangen wurde < /li>
< /ul>
$ ./a.out
parent: pid = 294729, ppid = 291330, pgrp = 294729, tpgrp = 294729
child: pid = 294730, ppid = 294729, pgrp = 294729, tpgrp = 294729
< /code>

 Oder Seufzer wurde empfangen, aber das Kind hat es nicht gedruckt, es ist PID -Ausgabe (so dass es nicht richtig weiterging) < /li>
< /ul>
$ ./a.out
parent: pid = 295709, ppid = 291330, pgrp = 295709, tpgrp = 295709
child: pid = 295710, ppid = 295709, pgrp = 295709, tpgrp = 295709
SIGHUP received, pid = 295710
< /code>

 Oder Kind hat es nach Sigcont ausgedruckt, aber ich habe keinen Fehler bei Ty$ ./a.out
parent: pid = 294722, ppid = 291330, pgrp = 294722, tpgrp = 294722
child: pid = 294723, ppid = 294722, pgrp = 294722, tpgrp = 294722
SIGHUP received, pid = 294723
child: pid = 294723, ppid = 2065, pgrp = 294722, tpgrp = 294722
Ich möchte eine Vorstellung davon bekommen, warum zwischen den Ergebnissen eine solche Varianz besteht.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post