/* * This program handles SIGINT and forwards it to another process. * It is intended to be run as PID 1. * * Docker starts processes with "docker run" as PID 1. * On Linux, the default signal handler for PID 1 ignores any signals. * Therefore Ctrl-C aka SIGINT is ignored per default. */ #include #include #include #include #include int pid = 0; void handle_sigint (int signum) { if(pid) kill(pid, SIGINT); } int main(int argc, char *argv[]){ struct sigaction new_action; int status = -1; /* Set up the structure to specify the new action. */ new_action.sa_handler = handle_sigint; sigemptyset (&new_action.sa_mask); new_action.sa_flags = 0; sigaction (SIGINT, &new_action, (void*)0); pid = fork(); if(pid){ wait(&status); return WEXITSTATUS(status); }else{ status = execvp(argv[1], &argv[1]); perror("exec"); return status; } }