When the test's child signals its parent and it exits the result of
getppid changes. On Ubuntu 20.04 this results in the ppid being that
of the GDM session, causing it to exit. Analysis and testing from pedro
at ambientworks.net
sa.sa_flags = SA_RESTART;
(void)sigaction(SIGTERM, &sa, NULL);
if ((pid = fork()) == 0) { /* child */
+ pid = getppid();
sleep(1);
- kill(getppid(), SIGTERM);
+ kill(pid, SIGTERM);
sleep(1);
- kill(getppid(), SIGKILL);
+ if (getppid() == pid) /* if parent did not exit, shoot it */
+ kill(pid, SIGKILL);
exit(0);
} else { /* parent */
r = select(0, NULL, NULL, NULL, NULL);