#include #include #include #include #include #include #include int main (int argc, char * argv[], char * env[]) { int pid; int i, code, count; pid = fork (); if (pid) { /* Parent */ sleep (10); printf ("Killing Children (SIGTERM)\n"); if (kill (-pid, SIGTERM) < 0) perror ("kill (SIGTERM)"); printf ("Done\n"); sleep (10); printf ("Killing Children (SIGKILL)\n"); if (kill (-pid, SIGKILL) < 0) perror ("kill (SIGKILL)"); printf ("Done\n"); while (pid != wait (&code)); if (WIFEXITED (code)) { printf ("Normal exit with exitcode %d\n", WEXITSTATUS (code)); } else if (WIFSIGNALED (code)) { printf ("Signal %d received", WTERMSIG (code)); if (WCOREDUMP (code)) { printf (" (core dumped).\n"); } else { printf (" (no core).\n"); } } else { printf ("Neither normal exit nor signal\n"); } return 0; } else { /* Child */ char ** envp; if (setpgrp () < 0) { perror ("setpgrp"); kill (getppid (), SIGTERM); exit (1); } printf ("Process Group created\n"); count = 1; while (argv[count] && strchr (argv[count], '=')) count++; if (argv[count] == NULL) { fprintf (stderr, "No command specified\n"); return 1; } envp = malloc ((count+1)*sizeof (char*)); for (i=1; i < count; ++i) envp[i-1] = argv[i]; envp[i] = NULL; argv += count; execve (argv[0], argv, envp); /* Exec failed */ perror ("execve"); return 1; } return 0; }