/* * Pai envia SIGTERM para o filho * Filho envia SIGTERM para o pai * Será que ambos vão morrer? */ #include #include #include #include int pai; int pid; void trata_SIGTERM(int signum) { if (getpid() != pai) kill (getppid(), SIGTERM); /* Filho ferido mata o pai */ else kill (pid, SIGTERM); /* Pai ferido mata o filho */ printf("Oh! Eu fui assassinado... pid = %d\n", getpid()); sleep(1); signal(SIGTERM, SIG_DFL); /* Re-instala a ação padrão para o SIGTERM e */ raise(SIGTERM); /* levanta outro sinal para terminar a execução */ } int main() { pai = getpid(); signal(SIGTERM, trata_SIGTERM); /* Instalacao do tratador de sinal */ if ((pid = fork()) != 0) { printf("Processo pai, pid = %d\n", getpid()); kill(pid, SIGTERM); /* Pai envia sinal para matar o filho e */ while (1) sleep(1); /* espera pela morte... */ } else { printf("Processo filho, pid = %d\n", getpid()); kill (getppid(), SIGTERM); /* Filho envia sinal para matar o pai e */ while (1) sleep(1); /* espera pela morte... */ } return 0; /* Retorno nunca executado */ }