/* * Pai envia SIGTERM para o filho * Filho envia SIGTERM para o pai * Ambos devem morrer. */ #include #include #include #include void trata_SIGTERM(int signum) { printf("Oh! Eu fui assassinado... pid = %d\n", getpid()); 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() { sigset_t block_sigterm; int pid; sigemptyset (&block_sigterm); sigaddset (&block_sigterm, SIGTERM); sigprocmask (SIG_BLOCK, &block_sigterm, NULL); 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 */ sigprocmask (SIG_UNBLOCK, &block_sigterm, NULL); /* espera pela morte... */ while (1) sleep(1); } else { printf("Processo filho, pid = %d\n", getpid()); kill (getppid(), SIGTERM); /* Filho envia sinal para matar o pai e */ sigprocmask (SIG_UNBLOCK, &block_sigterm, NULL); /* espera pela morte... */ while (1) sleep(1); } return 0; /* Retorno nunca executado */ }