|  | #include <unistd.h> | 
|  | #include <stdio.h> | 
|  | #include <string.h> | 
|  | #include <signal.h> | 
|  |  | 
|  | pid_t pid; | 
|  |  | 
|  | void signal_handler(int signal) { | 
|  | int res = kill(pid, SIGKILL); | 
|  | } | 
|  |  | 
|  | int main(int argc, char *argv[]) | 
|  | { | 
|  | pid = fork(); | 
|  |  | 
|  | if (pid == -1) { | 
|  | perror("Fork failed when trying to spawn qemu process.\n"); | 
|  | return 1; | 
|  | } else if (pid == 0) { /* Child process */ | 
|  | char* prog_name = "qemu-system-x86_64"; | 
|  | char* params[argc]; | 
|  | int i; | 
|  |  | 
|  | params[0] = prog_name; | 
|  | for (i = 1; i < argc; ++i) | 
|  | { | 
|  | params[i] = argv[i]; | 
|  | } | 
|  | params[argc] = NULL; | 
|  |  | 
|  | execvp(prog_name, params); | 
|  | } else { /* Parent process */ | 
|  | int status; | 
|  |  | 
|  | if (signal(SIGUSR1, signal_handler) == SIG_ERR) { | 
|  | fputs("An error occurred while setting a signal handler.\n", stderr); | 
|  | return 2; | 
|  | } | 
|  |  | 
|  | (void) waitpid(pid, &status, 0); | 
|  | } | 
|  |  | 
|  | return 0; | 
|  | } |